一个名为test()的友元函数被定义在模板类A内:
template <typename T> class A {
public:
friend void cs() {/* code */}
}
另一个类继承自模板类A:
class B : public A<B> {}
在主函数中,如果我不在全局范围内提供函数声明,编译器就无法看到cs()的声明,导致我未能成功调用cs()。
int main(){
cs()
}
但是当cs将其模板类T作为参数时,情况就不同了:
template <typename T> class A{
public:
friend void cs(const T& t) {}
}
现在,在主函数中可以成功调用cs(),无需任何声明:
int main(){
B b;
cs(b);
}
如果一个函数的参数为用户自定义类,编译器会查找该用户自定义类的作用域。那么cs()函数在哪个作用域中定义呢?如何才能确保在第二种情况下成功调用cs()函数呢?
cs
是一个成员函数,但你却将其作为自由函数调用。第二个示例也不应该工作。这就是你所有的代码吗? - Rudolfs Bundulis