有人知道为什么会这样编译吗:
template<typename T>
class Foo;
template<typename T>
bool operator==(const T& l, const Foo<T>& r);
template<typename T>
class Foo
{
public:
Foo();
~Foo();
friend bool operator== <> (const T& l, const Foo<T>& r);
bool operator==(const Foo<T>& r);
};
但这不是(唯一的区别是成员与好友操作员的顺序==):
template<typename T>
class Foo;
template<typename T>
bool operator==(const T& l, const Foo<T>& r);
template<typename T>
class Foo
{
public:
Foo();
~Foo();
bool operator==(const Foo<T>& r);
friend bool operator== <> (const T& l, const Foo<T>& r);
};
我对第二种情况感到头疼,在朋友热线中出现了“错误:‘operator==’声明为非函数”。我最终决定在朋友声明之前一定有问题,所以我尝试在代码中将其向上移动,看看是否会得到不同的错误。你瞧,当我将其移到成员声明上方时,一切正常!
声明
friend bool operator== <> (const T& l, const Foo<T>& r);
不适用于您在类上方声明的非成员函数。
那个
friend
声明应该看起来像这样
template<typename U>
friend bool operator==(const T& l, const Foo<U>& r);
有了这个,您不需要
Foo
或非成员 operator==
函数的前向声明。