C++模板類內友元(友元函數,友元類)聲明的三種情況


根據《C++ Primer》第三版16.4節的敘述,C++類模板友元分為以下幾種情況
1.非模板友元類或友元函數。 書上給了一個例子:
class Foo{
    void bar();
};
template <class T>
class QueueItem{
    friend class foobar;
    friend void foo();
    friend void Foo::bar();
    //....
};
很簡單,跟非模板類沒什么區別,有一點需要注意,如果要把函數和類生命為友元,前面不需要聲明或定義。但是如果要把類成員函數聲明為友元,則前面必須有類的定義(注意不是聲明,是定義),因為一個類成員只能由該類的定義引入 。

2.綁定的友元類模板或函數模板。 例子如下:
template <class Type>
    class foobar{ ...};

template <class Type>
    void foo(QueueItem<Type>);

template <class Type>
class Queue{
    void bar();
    //...
};

template <class Type>
class QueueItem {
    friend class foobar<Type> ;
    friend void foo<Type> (QueueItem<Type>);
    friend void Queue<Type> ::bar();
    //...
};
需要注意兩點:
    a.與非模板函數或類不同,模板函數或類聲明為友元之前必須在前面聲明過 ,否則無法通過編譯。
    b.注意紅字部分,那幾個Type不能少。比如對於函數foo,如果少了<Type>的話編譯器會將其作為非模板函數對待,也就是說,對於QueueItem<int>,編譯器會查找void foo(QueueItem<int>),而對template<class T>void foo(QueueItem<T>)視而不見,如果沒找到非模板函數則會報錯。

3.非綁定友元類模板或函數模板。 舉例如下:
template <class Type>
class QueueItem {
    template<class T>
        friend class foobar;

    template<class T>
        friend void foo(QueueItem<T>);

    template<class T>
        friend void Queue<T>::bar();
    //...

};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM