[英]Forward declaration of template friend function
請考慮以下完全正常的代碼片段:
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);
是模板實例化的朋友聲明。 那不一樣。 實例化不聲明模板功能。
你可以成為整個函數模板的朋友,然后不需要轉發聲明:
template <typename T>
class B
{
private:
T d;
public:
B(T n){ d = n;}
template<class U>
friend U foof(B<U> a);
};
為什么前面的聲明在第二個例子中是必要的而不是在第一個例子中?
因為在語法上第二個不是可用於聲明函數的形式,但第一個是。
另外,為什么我必須把<>放在B類的foof聲明中呢? 為什么在模板內聲明它是不夠的?
你表明你正在為一個功能模板的特化提供信息,而不是為一個非模板的功能提供信息,這就是它的意思。 您可以擁有類模板的非模板友元函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.