찾다

 >  Q&A  >  본문

c++ - 模板友元声明中的作用域和前置声明问题

// 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的前置声明?
};
迷茫迷茫2805일 전639

모든 응답(1)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-17 13:09:40

    在你这个例子里面, 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>这种倒是用过.

    회신하다
    0
  • 취소회신하다