2012-12-04 53 views
1

下面是一个简单的C++程序,它与我的MinGW的编译器编译,并如预期执行:试图了解“模板<class U>朋友类B”;语法

#include <iostream> 


template <class T> class A { 
    T a; 
    template <class U> friend class B; 

    public: 
    A<T> (T t) : a(t) {} 
}; 



template <class T> class B { 
    A<T> aa; 

    public: 

    B<T> (T t) : aa(t) {} 

    T getT() const {return aa.a;} 
}; 


int main() { 
    B<int> b(5); 
    std::cout << "> " << b.getT() << std::endl; 
} 

由于B<T>::getT()访问私人A<T>::a成员,A<T>使得B<T>template <class U> friend class B;线的朋友。

不幸的是,我不知道为什么这条线需要这样写。直觉上,我会预期像friend class B<T>,但是,这不会编译。

新引入U的含义是不明确为好,因为A的和B的依赖型是在两种情况下T

所以,总之,我很感激任何关于这条线的语法是如何派生或推导的。

+0

如果你尝试'朋友B类'有什么错误? – Walter

回答

5

有许多不同的友谊和模板排列。

您现在的代码使B任何模板专业化成A<T>一个朋友,所以例如B<char>A<int>的朋友。

如果你只是想使匹配A<T>的朋友,你会说这样的:

template <typename> class B; // forward declare above! 

template <typename T> 
class A 
{ 
    // ... 

    friend class B<T>; 
}; 
3

恕我直言,friend class B<T>;会工作过你插入预先声明

template<class T> class B; 

之前的class A<T>

template <class U> friend class B;使得每个class B<U>的朋友,而不仅仅是class B<T>