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

有两种解决方案:您可以将它们定义为类内部的 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 回答
0

如果您不关心隐式转换,您可以将它们设置为成员函数,这样您就不必每次都重新键入它。

但如果你必须将它们定义为自由函数,恐怕你别无选择。

于 2013-06-10T10:14:52.460 回答