我目前正在阅读“Effective C++”,其中有一章包含与此类似的代码:
template <typename T>
class Num {
public:
Num(int n) { ... }
};
template <typename T>
Num<T> operator*(const Num<T>& lhs, const Num<T>& rhs) { ... }
Num<int> n = 5 * Num<int>(10);
这本书说这不起作用(实际上它不起作用),因为您不能期望编译器使用隐式类型转换来专门化模板。
作为一种解决方案,建议使用“friend”语法在类中定义函数。
//It works
template <typename T>
class Num {
public:
Num(int n) { ... }
friend
Num operator*(const Num& lhs, const Num& rhs) { ... }
};
Num<int> n = 5 * Num<int>(10);
并且本书建议每当我需要隐式转换为模板类类型时使用这个朋友声明。这一切似乎都说得通。
但是,为什么我不能使用通用函数而不是运算符获得相同的示例?
template <typename T>
class Num {
public:
Num(int n) { ... }
friend
void doFoo(const Num& lhs) { ... }
};
doFoo(5);
这次编译器抱怨他根本找不到任何“doFoo”。如果我在类之外声明 doFoo,我会得到合理的不匹配类型错误。似乎“朋友……”部分只是被忽略了。
那我的理解有问题吗?在这种情况下,函数和运算符有什么区别?