考慮下面的代碼片段工作完全正常:模板友元函數的轉發聲明
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聲明中?爲什麼它不足以在模板中聲明?我想了解這些工作是如何工作的,以便在我需要使用它時不必盲目記住這種代碼。
感謝
注意:後者有潛在的意外後果。它說,對於任何給定的'T',我們正在友好* foof'的所有*實例化,無論'T'是否是模板參數。總之,'int fo(B );'是'B '的朋友。在採用焦土焦域方法之前,請考慮這是否是一個問題 - 如何使模板函數(或類)的所有實例化。 –
WhozCraig