c++ - 模板友元声明中的作用域和前置声明问题
迷茫
迷茫 2017-04-17 13:07:40
0
1
633
// forward declaration necessary to be friend a specific instantiation of a template 
template <typename T> class Pal; 
class C {  
    friend class Pal<C>;  
    template <typename T> friend class Pal2; 
}; 
template <typename T> class C2 
{
    friend class Pal<T>;  
    // a template declaration for Pal must be in scope   
    //上面这句注释的在作用域内是什么意思?Pal的模板声明明明在class C2的外面
    friend class Pal3; //为什么不需要Pal3的前置声明?
};
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(1)
大家讲道理

在你這個例子裡面, Pal類別已經聲明過了, 那個scope的意思並不是寫到C2類裡面才能叫scope, scope應該翻譯成上下文, 上下文包括{}裡面定義的類別還包括{}外面定義的類別.

友元的本意是告訴編譯器, 給我突破C++private的存取限制, 本身沒有涉及到連結環節, 所以只需要編譯器知道哪個類別有這個權限, 而不關心類別的實作.一個普通的類別, 只需要一個名字, 就像你例子裡面寫的Pal3, 而模板類稍微特別一些, 模板類需要模板參數組合在一起才是一個實際的類, 所有就有class C裡面的Pal<C>template<typename T> class Pal2.

PS: 說實話, template<typename T> friend class Name這種用的非常少, 只是見過還沒用過, Pal<C>這種倒是用過.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板