2011-10-19 9 views
4

私はこのようになりますヘッダファイルを持って、私は動的ライブラリにコンパイルしようとしていますC++のオーバーロード出力オペレータ

//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の質問をチェックしたが、私が知る限り、私は正しい演算子のオーバーロードのためのフォーマットがあります。あなたの.cppファイルで

答えて

3

は、usingを言うが、代わりに適切な名前空間宣言していません:あなたはそれを助けることができるかどうか実際に

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

を、何気なく全くusingを言うことはありません。私の意見では、明示的なベースメンバの隠蔽とADL要求のために予約する必要があります。

+0

これはうまくいきます。さて、私は同じミスをもう一度しないように、なぜ以前にはうまくいかなかったのですか? (タイムアウトが起きたらすぐに回答を受け入れる)。 –

+0

':microtask :: log :: operator <<'ではなく ':: operator <<'を定義していました。これは単なる別の機能であり、必要なものはまだありません。あなたの孫でさえ感謝する恒久的な解決策は、決して使用しないことです:-) –

+0

ああ、よく分かります。 Idk、それは、私がそのようなクラスメソッドの実装を宣言するために使用されたので、ちょうど私を捨てました。 –

関連する問題