给定以下代码。
#include <iostream>
template<typename T>
class Foo
{
public:
Foo(const T& value = T());
friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs)
{
// ...
}
friend std::ostream& operator<< (std::ostream& o, const Foo<T>& x)
{
// ...
}
private:
T value_;
};
编译器可以毫无问题地编译两个具有模板参数的友元函数,而无需以下语法
template <typename T>
friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs)
或者
friend Foo<T> operator+ <>(const Foo<T>& lhs, const Foo<T>& rhs)
或者
friend Foo<T> operator+ <T>(const Foo<T>& lhs, const Foo<T>& rhs)
因为它们是由模板类本身的实现定义的。
编译器如何在不包含模板声明的情况下使用它们的模板参数编译这些友元函数?为什么只在类内部实现它们就足够了?
我在“使用模板好友时为什么会出现链接器错误?”一节中了解了这个概念。