0

これは機能しません

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

これはこれを解決する正しい方法ですか?演算子 <,>,<=,>=,!= も定義したいのでtemplate<typename T>、それらすべてを実行すると時間がかかります。

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

2 に答える 2

2

解決策は 2 つあります。クラス内で const メンバ関数として定義できます。

template<typename T>
struct foo {
  T t;

  bool operator==(const foo &lhs, const foo &rhs) const { return lhs.t == rhs.t; }
  // same for the other relational operators
};

fooこれは、クラス内で の短縮形として使用できるため 機能しfoo<T>ます。

別の方法は、それらをクラス内のフレンド非メンバー関数として定義することです

template<typename T>
class foo {
  T t;

  friend bool operator==(const foo &lhs, const foo &rhs) const { return lhs.t == rhs.t; }
  // same for the other relational operators
};

tプライベート メンバーとして定義する場合は、アクセスできるようにするために実際に関数を作成operator==する必要があります。friendただし、これには、周囲の名前空間に非メンバー非テンプレート関数としてそれらを注入するという副作用があることに注意してください。これは、引数依存の名前検索にいくつかの結果をもたらします。

于 2013-06-10T10:31:03.480 に答える