2017-06-08 19 views
0

私が使用してテキストモードで表現することができるオブジェクトのための小さなインターフェースそうのようなoperator<<を作成しました:フレンドオペレータとのインターフェイス<<:なぜリンクできませんか?

私は、このインターフェイスを継承して、コンパイルの作品を構築しようが、私は、以下のリンクを取得
// ICliObject.h 

class ICliObject 
{ 
public: 

    ~ICliObject() = default; 
    friend std::ostream& operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject); 


protected: 
    virtual void print(std::ostream& p_stream) const = 0; 

}; 


std::ostream& operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject) 
{ 
    p_cliUiObject.print(p_stream); 

    return p_stream; 
} 

エラー:In blablabla.cpp: multiple definition of operator<<(std::ostream& p_stream, const ICliObject& p_cliUiObject)

すべての派生クラスで、私はオペレータを再定義/宣言しませんでした。私が問題を解決できる唯一の方法は、オペレータをインラインでICliObject.hにインライン化することです。 何が起こっているのですか?

注:私はUbuntuでGCCを使用しています。

+1

ヘッダーの関数定義を 'inline'キーワードでマークするか、それをソースファイルに移動してください。 –

+1

関数定義に 'inline'を追加する必要があります。 –

+0

リンカーエラーをコピーして、SOでそれを検索してください。あなたは、そのテーマに関する1つ以上の質問を見つけるかもしれません。 –

答えて

3

friendまたはoperator<<または継承とは関係ありません。あなたのプログラムでそう複数回行う場合、このエラーが表示されます(含めて複数の翻訳単位で#includeは、ヘッダファイルにそれを持っていることによって)、名前空間スコープで定義された任意の機能(またはオブジェクト)のような

そして、これらすべての他の例では、ソリューションは、「ソースファイル」への実装を移動したり、あなたがすでに提案し、その上に inlineキーワードを(固執するのいずれかであるが、それは私がドン文字通りソリューションですLIKE」なぜそれが受け入れられないのか分かりません)。

+0

もう1つの解決策は、クラス定義の中で関数を定義することです(暗黙的に 'inline'になります)。 –

+0

' operator << 'のためにクラス外(同じヘッダファイル内)に定義しました。プログラム間で何度も繰り返し、リンクエラーが発生しました。私はそれを得る、ありがとう。 – BobMorane

関連する問題