1

クラスで binary_search を使用したかったので、operator< を定義しました。すべてがメインファイルにある場合は機能しますが、クラスを別のファイルに書き込むとリンカエラーが発生しました。

問題を示す最も単純な例は Bh です。

class B
{
public:
~B(void);
string b;
int v;
B(int val, string bb);
friend bool operator< (const B &lhs, const B &rhs);
 };

 bool operator< (const B &lhs, const B &rhs){
    return lhs.v < rhs.v;
};

B.cpp はコンストラクターを定義するだけです。メインは次のようなものです:

#include "B.h"
int main( int argc, const char* argv[] )
{

vector<B> vec;
B a1(2, "gg");
B a2(4, "gdhd");
    vec.push_back(a2);
    vec.push_back(a1);
bool pos = binary_search(vec.begin(),vec.end(), B(2, "ghd"));
}

エラー LNK2005: "bool __cdecl operator<(class B const &,class B const &)" (??M@YA_NABVB@@0@Z) already defined in Main.obj: 致命的なエラー LNK1169: 1 つまたは複数の乗算定義シンボル見つかった

それを修正する方法?

4

3 に答える 3

3

これは、ヘッダー ファイルで演算子が正しく定義されていないためです。あなたはそれを作る必要がありますinline(またはstatic)。

inlineまたはでない場合static、ヘッダー ファイルをインクルードする各ソース ファイルで関数が定義され、複数の定義エラーが発生します。

于 2013-04-30T08:45:08.400 に答える
2

ヘッダー ファイルで演算子関数を定義しています。これは、それを含むすべての .cpp ファイルが独自のコピーを取得することを意味します。考えられる解決策は 2 つあります。

  1. 関数をマークしますinline

  2. 関数を .cpp ファイルに移動する

于 2013-04-30T08:45:49.753 に答える
0

宣言されていない関数はinline、最大 1 つの翻訳単位で定義する必要があります。B.cppファイルの内容にヘッダーをmain()含めることB.hで、2 つの定義が得られます。逆に、 function を宣言する場合inlineは、それが使用される各翻訳単位に定義を含める必要があるため、ヘッダーに定義を含めることは正しいことです。

したがって、演算子の実装をヘッダーにとどめたい場合は、inlineその定義で修飾子を使用するか、 の定義内で演算子を直接定義しclass Bて、それをフレンドとして宣言する必要があります。後者は暗黙的にインライン化します。

それ以外の場合は、オペレーターの定義をファイルに移動する必要がありB.cppます。

于 2013-04-30T08:49:47.630 に答える