1. 程式人生 > >模板類中包含模板類友元和其他友元函式

模板類中包含模板類友元和其他友元函式

發表一點自己對 《C++ Primer 5th》模板那塊的理解, 歡迎指正

一對一友好關係

在類模板與另一個模板(模板類或模板函式)間建立對應例項及其友好關係,為了在類模板中引用另一個類模板或函式的一個特定例項,必須先宣告另一個模板:
方便理解和敘述,將含友元的類稱為主類,將要做友元類的模板類稱為客類

//為了在類裡面引用 BlobPtr<T> 和 poerator==<T> 現在類之前宣告
template <typename> class BlobPtr;
template <typename> class Blob; 
template
<typename T> bool operator==(const Blob<T>&, const Blob<T>&); template <typename T> class Blob{ friend class BlobPtr<T>; //客類 friend bool operator==<T>; //主類 (const Blob<T>&, const Blob<T>&); .... }; //模板類友元運算子過載函式定義: template <typename
T> bool operator==<T>(const Blob<T>& lhs, const Blob<T>& rhs) { ... }

也就是說只有 BlobPtr<int> operator==<int> 才是 Blob<int> 的友元.而 BlobPtr<std::string> 不是 Blob<int> 的友元

通用和特定的模板友好關係

  1. 將客類的每個例項都宣告為主類的友元
  2. 將客類的特定例項宣告為主類的友元

對於第一種情況不需要在模板類前置宣告

template <typename T>
class C1
{
    //C1每個例項將擁有相同例項化的Pal宣告為友元
    friend class Pal<T>;
    //Pal2所有例項都是 C1 的每個例項的友元 不需前置宣告
    template <typename X> friend class Pal2;

};

Pal2<int>, Pal2<std::string> 都是 C1<int> 或者 C1<std::string> 的友元

第二種情況需要前置宣告

template <typename T> class Pal;

class C2 //C2不是模板類
{
    //C2每個例項將 用C1型別例項化的Pal 宣告為友元
    friend class Pal<C1>;

};

總結:

  1. 如果想將客類的所有例項作為主類每個例項的友元,那麼不需要再主類前宣告客類模板,也不需要宣告友元時加,並且在主類內部宣告客類為主類友元之前要加上客類的模板引數列表,而且還不能和主類引數名一樣,如:
template<typename T> class 主類
{
    template <typename X> //模板引數和主類不一樣
    friend 客類; 
};
  1. 如果只想將擁有和主類相同例項的客類或模板函式作為主類的友元,那就先在主類前宣告客類(帶模板引數列表template), 然後在主類中宣告客類friend(帶模板引數,不帶template)並且模板引數<T>需要和主類的引數名相同。
template<typename > class 客類;
template<typename T> class 主類
{
    friend 客類<T>; //模板引數和主類一致
};

相關推薦

模板包含模板其他函式

發表一點自己對 《C++ Primer 5th》模板那塊的理解, 歡迎指正 一對一友好關係 在類模板與另一個模板(模板類或模板函式)間建立對應例項及其友好關係,為了在類模板中引用另一個類模板或函式的一個特定例項,必須先宣告另一個模板: 方便理解和敘述,將含

C++模板的派生訪問基成員必須顯式呼叫(作用域限定)

一個常見的派生類訪問基類成員變數的例子:template<int dim>class A{public:A():b(2){}int b;};template<int dim>class B:public A<dim>{public:   

關於模板,子無法訪問父成員問題的解決方法

問題: 今天研究資料結構,按著書敲程式碼,發現子類中直接呼叫父類成員居然無法通過編譯。 看了好久都沒發現問題,嘗試將父類private屬性改為public,發現也是不行。 解決辦法: 然後我想著用域作

黑馬基礎階段測試題:創建Phone(手機),Phone包含以下內容:

ring post power 試題 println one 控制臺 sta 創建 package com.swift; public class Phone { private String pinpai; private int dianl

Object包含的方法

在根類Object中包含的方法:  clone();equals();finalize();getClass();[align=left][/align]notify(),notifyAll();hashCode();toString();wait();我們知道所有的類都是

當一個包含其他的物件時建構函式的呼叫順序

1.按在組合類的定義中出現的順序呼叫內嵌物件的建構函式(與初始化列表中出現的順序無關) 2.呼叫本類建構函式的函式體 組合類建構函式定義的一般形式一般為: 類名::類名(形參表):內嵌物件1(形參表),內嵌物件2(形參表),……

C++學習總結(十一)——的靜態函式,成員函式的預設引數,包含引用常量

一.類的靜態成員變數,以及靜態函式。 靜態成員變數: 1.靜態成員共享機制 2.靜態成員區域性屬於類,它不是物件的成員,位於靜態區。 3.靜態成員變數需要在外部進行初始化。 靜態函式: 1.靜態成員函式都在程式碼區,類的靜態函式都是共享的。 2.類的大小不包含程式碼區,建立

JAVA在泛型基獲取子傳遞的泛型參數

throw oca abstract () current 全部 getclass back charset 最近在開發微信代扣,涉及大量HTTP調用微信,就寫了一個泛型模板,將序列化,反序列化,HTTP調用全部整合至泛型基類中. public abstract cla

在子重用父的屬性

size 繼承 rom elf attack 綁定 不用 pri lap 在子類中派生出新的方法重用父類的方法,有兩種實現方式 方式一:指名道姓(不依賴繼承) class Hero: def __init__(self,name,damage,zing):

在子重用父的方法或屬性

self. mce 返回 繼承關系 怎麽 gre 沒有 nbsp dem 在子類派生出新發方式中重用父類的方法,有兩種實現方式1.指名道姓(不依賴繼承)# class Hero:# def __init__(self,nickname,life_value,aggr

Java toString 及的組合

class WaterSource{ private String s; WaterSource(){ System.out.println("WaterSource()"); s="Contructed"; } public String toString(){return s;}

Qt如何將訊息在2個沒有關係的從一個傳送到另一個

條件: ①2個類直接沒有任何關係; ②接收訊息的類必須有一個全域性變數; ③ QMetaObject::invokeMethod((QObject*)全域性變數類, "接收的方法", Qt::AutoConnection, Q_ARG(接收的引數型別, 接收的引數)); cla

在子呼叫父的方法

在子類中呼叫父類的方法 class Vehicle: Country='China' def __init__(self,name,speed,load,power): self.name=name self.speed=speed se

關於定義自身物件的問題

在C++的類定義中,是不能夠在類中定義自身類的物件的,但是可以定義自身類的指標物件和引用。 class A { public:  A ()  {   cout<<“Constructor method.”<<endl;  };  A a;

面向物件 5繼承與重用性&派生&在子重用父的方法

繼承 繼承指的是類與類之間的關係,是一種什麼是什麼的關係, # # class Paraentclass1: # pass # # class Paraentclass2: # pass # # class SubClass1(Paraentcl

C# 隱藏基方法Partial

C# 類中隱藏基類方法和Partial 時間 2014-11-14 11:50:03   薑糖水 原文   http://www.cnphp6.com/archives/60699

使用POI做的一個生成Excel的工具包含了導出Excel解析Excel方法

time 類型 解析excel rom 統計表 pty reat iou 包括 PoiExcelUtils.java /** * */ package com.common.office; import java.io.File; import java.io.

c++ typedef的型別名的作用

typedef long INDEX 給long這樣的型別起別名,它有兩個用處:一是表明該型別的特殊作用,二是將來有可能要改變這種型別(比如提高精度), 但是現在瞭解到可以在class類裡面使用(並且還有public,private之分哦) C++引入“僅在類內部起作用

的過載操作符(=)copy建構函式的區別

過載操作符的關鍵字? copy建構函式? 過載“”=“”? 兩種方式的使用方法有什麼不同? lhs和rhs變數的含義?經常在哪裡面見到? lhs指的是==運算子左邊的運算元;(left-hand side) rhs指的是==運算子右邊的運算元;(righht-han

[反射初探]根據反射獲取引數型別及引數名引數值

public String getMyDeclaredMethods(T t) { Class<?> c = t.getClass(); Method m[] = c.getDeclaredMethods(); String text = "";