簡體   English   中英

模板好友功能的前向聲明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM