为什么这段代码会给我一个链接器错误,我该如何解决?
架构x86_64的未定义符号:“operator ==(foo const&,foo const&)”,引自:main.o中的_main ld:未找到架构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;
}
答案 0 :(得分: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;
};
答案 1 :(得分:1)
operator==
是一个函数模板,但友情声明并未反映这一点。这是修复它的一种方法:
template <class U>
friend bool operator==(const foo<U> &lhs, const foo<U> &rhs);
一个非常小的故障是它允许operator==<int>
朋友访问foo<string>
。出于这个原因,我认为@ JesseGood的解决方案更清晰,虽然(矛盾地)更加冗长。
答案 2 :(得分:0)
您需要再次指定模板类型,但与类模板类型不同:
template<typename V>
friend bool operator==(const foo<V> &lhs, const foo<V> &rhs);
答案 3 :(得分:-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;
}