0

同じソートアルゴリズムを使用している場合、どうしてですか?

bool Sorter(const Object* n1, const Object* n2) { return (n1->GetValue() < n2->GetValue()); }

別の.cppファイルで、リンカー(lは信じています)は私に複数定義されたシンボル-errorを与えますか?それらの名前を変更すると(Sorter1、Sorter2、..)、コンパイルされます。これらのクラスは同じ親クラスから継承されますが、親にはアルゴリズムがありません。クラスが互いに直接接触しておらず、興味があるのに、なぜこれがエラーになるのか理解できません。

また、親クラスなどからソーターを直接参照する方法はありますか、それともソーターを使用する関数を作成するだけですか?

4

4 に答える 4

3

デフォルトでは、関数には外部リンケージがあります。つまり、関数の宣言があるソース ファイルは、どのファイルに定義があるかに関係なく、それを使用できます。リンカーは、さまざまな用途を接続する責任があります。そのため、複数の用途が見つかったときに文句を言います。

関数が含まれているソース ファイルに対して関数を非公開にするには、staticキーワードを使用するか、名前のない名前空間に配置する必要があります。

すべての関数定義が同一である場合、inlineキーワードを使用してそれらが同一であることをリンカーに示すことができますが、その場合、完全に安全にするために関数をヘッダー ファイルに入れる必要があります。

于 2012-09-10T21:19:30.430 に答える
1

のように書いてみてください

static bool Sorter(const Object* n1, const Object* n2) { 
  return (n1->GetValue() < n2->GetValue()); 
}

また

namespace { 
  Sorter(const Object* n1, const Object* n2) {  
     return (n1->GetValue() < n2->GetValue()); 
  }
}

これにより、探している cpp ごとのスコープが得られます。

ヘッダー ファイル内に関数を記述している場合は、次を使用します。

inline bool Sorter(const Object* n1, const Object* n2) { 
  return (n1->GetValue() < n2->GetValue()); 
}
于 2012-09-10T20:54:32.020 に答える
0

それらはクラスのメンバーではなく、無料の関数のようです。bool Class1::Sorter( blah ) { foo; }クラスメンバーを定義するには、必要ですbool Class2::Sorter(blah) { foo; }

于 2012-09-10T20:39:04.677 に答える
-1

Sorter はグローバル関数です。クラスやクラスからインスタンス化されたオブジェクトではありません。2 つのコンパイル単位で同じグローバル関数を宣言すると、リンケージ エラーが発生します。

于 2012-09-10T20:39:56.860 に答える