2012-12-04 49 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>