考虑以下运行良好的代码片段:
class A
{
private:
int d;
public:
A(int n){ d = n;}
friend int foo(A a);
};
int foo(A a)
{
return a.d;
}
但是,当我尝试为该类使用模板时,我需要转发声明友元函数才能运行,如下所示:
template <typename T>
class B;
template <typename T>
T foof(B<T> a);
template <typename T>
class B
{
private:
T d;
public:
B(T n){ d = n;}
friend T foof<>(B<T> a);
};
template <typename T>
T foof(B<T> a)
{
return a.d;
}
为什么前向声明在第二个例子中是必要的,而在第一个例子中却不需要?另外,为什么我必须放 <>
在 B 类中的 foof 声明中?为什么在模板内部声明它还不够?我正在努力理解这些东西是如何工作的,以便在我需要使用它时不必盲目地记住这种代码。
谢谢
最佳答案
那是因为
friend int foo(A a);
同时是函数声明和友元声明,但是:
friend T foof<>(B<T> a);
是模板实例化的友元声明。那不一样。实例化不声明模板函数。
你可以和整个函数模板成为 friend ,然后就不需要前向声明了:
template <typename T>
class B
{
private:
T d;
public:
B(T n){ d = n;}
template<class U>
friend U foof(B<U> a);
};
关于c++ - 模板友元函数的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39678663/