2011-10-19 109 views
4

我有一個頭文件看起來像這樣:C++重載輸出操作符

#pragma once 

//C++ Output Streams 
#include <iostream> 

namespace microtask 
{ 
    namespace log 
    { 
     /** 
     * Severity level. 
     */ 
     enum severity 
     { 
      debug, 
      info, 
      warning, 
      error, 
      critical 
     }; 

     /** 
     * Output the severity level. 
     */ 
     std::ostream& operator<<(std::ostream& out, const severity& level); 
    } 
} 

和看起來像這樣的一個源文件:

//Definitions 
#include "severity.hpp" 

//Namespaces 
using namespace std; 
using namespace microtask::log; 

std::ostream& operator<<(std::ostream& out, const severity& level) 
{ 
    switch(level) 
    { 
    case debug: 
     out << "debug"; 
     break; 
    case info: 
     out << "info"; 
     break; 
    case warning: 
     out << "warning"; 
     break; 
    case error: 
     out << "error"; 
     break; 
    case critical: 
     out << "critical"; 
     break; 
    default: 
     out << "unknown"; 
     break; 
    } 

    return out; 
} 

我試圖編譯成動態庫。不幸的是,鏈接失敗並顯示以下錯誤消息:

undefined reference to `microtask::log::operator<<(std::basic_ostream<char, std::char_traits<char> >&, microtask::log::severity const&)' 

我在做什麼錯?我檢查了其他似乎相似的stackoverflow.com問題,但據我所知,我有正確的重載操作符的格式。

回答

3

在您的.cpp文件,不說using,而是宣告正確的命名空間:

namespace microtask 
{ 
    namespace log 
    { 
     ::std::ostream & operator<<(::std::ostream& out, const severity& level) 
     { 
      // ... 
     } 
    } 
} 

其實,不要說隨便using在所有的,如果你能幫助它。在我看來,它應該保留給明確的基礎成員隱藏和ADL請求。

+0

那麼,這工作。現在,爲了不再犯同樣的錯誤,爲什麼以前不工作? (在超時結束後儘快接受你的答案)。 –

+0

您正在定義':: operator <<',而不是'microtask :: log :: operator <<'。這只是一個單獨的功能,而你需要的功能仍然缺失。永遠的解決方案,即使你的孫子們會感激的是,永遠不要使用':') –

+0

啊,我明白了,我想這是有道理的。 Idk,它只是讓我失望,因爲我曾經爲類方法聲明實現。 –