類模板因包含模板參數,導致友元宣告出現多種匹配形式,遠比一般類別複雜。主要分為六大類型:
friend class Pal<C>; — 僅 Pal<C> 為友元template <typename T> friend class Pal2; — Pal2 所有實例化皆為友元friend class Pal<T>; — 與外層類別相同模板參數template <typename X> friend class Pal2; — 參數名稱不可與外層相同friend class Pal3; — 非模板類別為友元friend T; — C++11 新增,模板型別參數直接為友元/*
* cppprimer.cpp - 類模板友元六種形式
* Created on: 2013.11.24
* Author: Caroline
* eclipse cdt, gcc 4.8.1
*/
#include <iostream>
#include <string>
template <typename T> class Pal;
template <typename T> class Pal2;
class Pal3;
class Pal4;
// 一般類別的友元宣告
class C {
friend class Pal<C>; // 形式1
template <typename T> friend class Pal2; // 形式2
private:
void print() { std::cout << "class C" << std::endl; }
};
// 類模板的友元宣告
template <typename T>
class C2 {
friend class Pal<T>; // 形式3
template <typename X> friend class Pal2; // 形式4
friend class Pal3; // 形式5
friend T; // 形式6 (C++11)
private:
void print() { std::cout << "class C2" << std::endl; }
};
// 各種友元類別實作
template <typename T> class Pal { ... };
template <typename T> class Pal2 { ... };
class Pal3 { ... };
class Pal4 { C2<Pal4> myC2; ... }; // 形式6 實際應用
Hello Mystra! this is class Pal : class C this is class Pal2 : class C this is class Pal : class C2 this is class Pal2 : class C2 this is class Pal3 : class C2 this is class Pal4 : class C2
關鍵觀察:Pal2<int> 內部的 C2<double> 仍可存取私有成員,證明友元關係不受模板參數實際型別限制。