0

このコードでリンカー エラーが発生するのはなぜですか? また、どのように修正すればよいですか?

アーキテクチャ x86_64 の未定義のシンボル: "operator==(foo const&, foo const&)"、参照元: main.old の _main: アーキテクチャ x86_64 のシンボルが見つかりません

template<typename T>
class foo {
  //friends get access to the private member t
  friend bool operator==(const foo<T> &lhs, const foo<T> &rhs);
  T t;
};

template<typename T>
bool operator==(const foo<T> &lhs, const foo<T> &rhs) {
  return lhs.t == rhs.t;
}

int main(int,char**) {
  foo<int> f1, f2;
  if (f1 == f2)
    ;
  return 0;
}
4

4 に答える 4

3

コードの修正は次のとおりです。

template<typename T>
class foo; // Forward declaration

template<typename T> // Need to define or declare this before the class
bool operator==(const foo<T> &lhs, const foo<T> &rhs) {
  return lhs.t == rhs.t; 
}

template<typename T>
class foo {
  // Notice the little <> here denoting a specialization
  friend bool operator==<>(const foo<T> &lhs, const foo<T> &rhs);
  T t;
};
于 2013-06-10T12:31:02.180 に答える
1

operator==は関数テンプレートですが、友情宣言はこれを反映していません。これを修正する 1 つの方法は次のとおりです。

template <class U>
friend bool operator==(const foo<U> &lhs, const foo<U> &rhs);

非常に小さな不具合の 1 つは、operator==<int>へのフレンド アクセスを許可することfoo<string>です。このため、@ JesseGoodの修正は(逆説的に)より冗長ではありますが、よりクリーンであると思います。

于 2013-06-10T12:31:15.970 に答える
0

テンプレート タイプを再度指定する必要がありますが、クラス テンプレート タイプとは異なります。

template<typename V>
friend bool operator==(const foo<V> &lhs, const foo<V> &rhs);
于 2013-06-10T12:31:57.777 に答える
-2

演算子をオーバーロードするときは、フレンド関数を使用しないでください。関数を public クラス メンバーとして定義し、引数を 1 つだけ (2 つではなく) 取るようにします。

template<typename T>
class foo {
  //public function allowing access to the private member t
  public:
  bool operator==(  foo<T> &rhs)
  {
      return t == rhs.t;
  }
  private:
  T t;
};


int main(int,char**) {
  foo<int> f1, f2;
  if (f1 == f2)
    ;
  return 0;
}
于 2013-06-10T12:29:10.407 に答える