国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

effective c++ 43-處理模板化基類的名稱 筆記

這篇具有很好參考價值的文章主要介紹了effective c++ 43-處理模板化基類的名稱 筆記。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

effective c++ 43-處理模板化基類的名稱

該節(jié)主要分析了一個寫模板時常常會遇到的一個編譯錯誤。

分析

這里有一個模板基類,有派生類繼承了模板基類,并調(diào)用了基類中的方法,但是編譯器卻會報找不該方法,這是怎么回事?

#include <string>
#include <iostream>
class CompanyA
{
public:
	void sendCleartext(const std::string& msg) 
    {
        std::cout << "A sendCleartext" << std::endl;
    }
	void sendEncrypted(const std::string& msg) 
    {
        std::cout << "A sendEncrypted" << std::endl;
    }
};


class CompanyB
{
public:
	void sendCleartext(const std::string& msg) 
    {
        std::cout << "B sendCleartext" << std::endl;
    }
	void sendEncrypted(const std::string& msg) 
    {
        std::cout << "B sendEncrypted" << std::endl;
    }
};


class MsgInfo {
public:
    MsgInfo(std::string msg):msg_(msg){}
private:
	std::string msg_{};
};


template<typename Company>
class MsgSender
{
public:

	void sendClear(const MsgInfo& info)
	{
		std::string msg;
		Company c;
		c.sendCleartext(msg);
	}

	void sendSecret(const MsgInfo& info)
	{
	}
};


template<typename Company>
class LoggingMsgSender : public MsgSender<Company>
{
public:
	void sendClearMsg(const MsgInfo& info)
	{
        sendClear(info);
	}
};

int main()
{
    MsgInfo info("test");
    LoggingMsgSender<CompanyB> loggingMsgSender;
    loggingMsgSender.sendClearMsg(info);
}

編譯輸出如下:

/home/work/cpp_proj/test2/main.cpp: In member function ‘void LoggingMsgSender<Company>::sendClearMsg(const MsgInfo&)’:
/home/work/cpp_proj/test2/main.cpp:63:9: error: there are no arguments to ‘sendClear’ that depend on a template parameter, so a declaration of ‘sendClear’ must be available [-fpermissive]
         sendClear(info);
         ^~~~~~~~~
/home/work/cpp_proj/test2/main.cpp:63:9: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/home/work/cpp_proj/test2/main.cpp: In instantiation of ‘void LoggingMsgSender<Company>::sendClearMsg(const MsgInfo&) [with Company = CompanyB]’:
/home/work/cpp_proj/test2/main.cpp:71:39:   required from here
/home/work/cpp_proj/test2/main.cpp:63:18: error: ‘sendClear’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
         sendClear(info);
         ~~~~~~~~~^~~~~~
/home/work/cpp_proj/test2/main.cpp:63:18: note: declarations in dependent base ‘MsgSender<CompanyB>’ are not found by unqualified lookup
/home/work/cpp_proj/test2/main.cpp:63:18: note: use ‘this->sendClear’ instead

從編譯的輸出也可以看出,原因是編譯器覺得sendClear含義不明確,編譯器也給出了解決辦法,使用this->sendClear,這里我們要思考的是,為什么編譯器會找不到sendClear函數(shù)呢? 不是就定義在模板基類中嗎?

實際上原因就是基類是一個模板類, 而模板類是可以被特化的,例如這里又有了一個CompanyZ,而MsgSender對于CompanyZ的特化版本可能就沒有sendClear方法,因此編譯器才會說sendClear含義不明確。

class CompanyZ
{
public:
	void sendEncrypted(const std::string& msg) {}
};


template<>
class MsgSender<CompanyZ>
{
public:
	void sendSecret(const MsgInfo& info)
	{
	}
};

好了,知道了原因之后,那么就可以給出解決辦法了,其實上面編譯器也已經(jīng)給出來一種辦法。

第一種就是在派生類中調(diào)用模板基類中的方法時加上this->。

template<typename Company>
class LoggingMsgSender : public MsgSender<Company>
{
public:
	void sendClearMsg(const MsgInfo& info)
	{
        this->sendClear(info);
	}
};

have a try

第二種就是在派生類中調(diào)用模板基類中的方法時加上使用using

template<typename Company>
class LoggingMsgSender : public MsgSender<Company>
{
using MsgSender<Company>::sendClear;

public:
	void sendClearMsg(const MsgInfo& info)
	{
		sendClear(info);
	}
};

have a try

第三種就是在派生類中明確指出使用MsgSender<Company>::sendClear(info)

template<typename Company>
class LoggingMsgSender : public MsgSender<Company>
{
public:
	void sendClearMsg(const MsgInfo& info)
	{
		MsgSender<Company>::sendClear(info);
	}
};

have a try文章來源地址http://www.zghlxwxcb.cn/news/detail-435096.html

總結(jié)

  • 在派生類模板中如果需要調(diào)用模板基類的方法,需要使用this->,或者明確指出名稱。

到了這里,關(guān)于effective c++ 43-處理模板化基類的名稱 筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Vue3實現(xiàn)組件級基類的幾種方法

    Vue3的組件有三種代碼組織方式 純Option API (不含setup) option API + setup 純 setup (即composition API) 對于這三種形式,設(shè)置基類的方法也略有不同。 vue3提供了 mixins和extends,但是嘗試之后發(fā)現(xiàn)這兩種方法只支持純OptionAPI,設(shè)置的data會被識別,但是設(shè)置的setup里return 的 reactive,完

    2024年02月01日
    瀏覽(22)
  • 【Unity之IMGUI】—位置信息類和控件基類的封裝

    【Unity之IMGUI】—位置信息類和控件基類的封裝

    ?????個人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : 缺點1:無法在編譯過程進行可視化調(diào)整 缺點2:無法分辨率自適應(yīng) 作用:讓控件根據(jù)調(diào)整對齊 最終代碼 特點: 類是抽象類:原因基類

    2024年02月12日
    瀏覽(26)
  • 基于C/C++將派生類賦值給基類的詳細講解

    目錄 將派生類對象賦值給基類對象 將派生類指針賦值給基類指針

    2024年02月08日
    瀏覽(18)
  • 【Unity之IMGUI腳本封裝】—位置信息類和控件基類的封裝

    【Unity之IMGUI腳本封裝】—位置信息類和控件基類的封裝

    ?????個人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : 缺點1:無法在編譯過程進行可視化調(diào)整 缺點2:無法分辨率自適應(yīng) 作用:讓控件根據(jù)調(diào)整對齊 最終代碼 特點: 類是抽象類:原因基類

    2024年02月17日
    瀏覽(21)
  • [Lua] 實現(xiàn)所有類的基類Object、模擬單繼承OO、實現(xiàn)抽象工廠

    Lua 沒有嚴格的 oo(Object-Oriented)定義,可以利用元表特性來實現(xiàn) 先定義所有類的基類,即 Object 類。代碼順序從上到下,自成一體。完整代碼 定義一個空表 Object , __index 指向其自身(繼承將直接使用該表作為對象的元表) new 定義構(gòu)造對象時的初始化行為,相當于 構(gòu)造器

    2024年02月11日
    瀏覽(24)
  • C++虛基類

    C++虛基類

    如果一個派生類是從多個基類派生出來的,而這些基類又有一個共同的基類,則在這個派生類中訪問這個共同的基類中的成員時,可能會產(chǎn)生二義性。 比如有以下結(jié)構(gòu) 以下程序會報錯,因為a具有二義性。 能夠看到a被初始化了兩次,我們希望a只被再第一次初始化以后就不再

    2024年02月08日
    瀏覽(14)
  • C++ | 繼承(基類,父類,超類),(派生類,子類)

    文章參考:https://blog.csdn.net/war1111886/article/details/8609957 一 .繼承中的訪問權(quán)限關(guān)系 1.基類,父類,超類是指被繼承的類,派生類,子類是指繼承于基類的類.? 2.在C++中使用: 冒號表示繼承,如class A : public B;表示派生類A從基類B繼承而來 3.派生類包含基類的所有

    2024年02月15日
    瀏覽(60)
  • OpenCV數(shù)字圖像處理實戰(zhàn)二:模板匹配(C++)

    OpenCV數(shù)字圖像處理實戰(zhàn)二:模板匹配(C++)

    (1)首先需要一個模板圖像 T(子圖像)和一個待檢測的圖像(源圖像 S) (2)在待檢測圖像從左到右,從上到下計算模板圖像與重疊子圖像的匹配度,匹配度越高,兩者相同的可能性越大。 3.1 單模板匹配 注意:result的長寬正好是(原圖-模板圖)的長寬,result圖中白亮程

    2024年02月15日
    瀏覽(22)
  • C++的基類和派生類構(gòu)造函數(shù)

    C++的基類和派生類構(gòu)造函數(shù)

    基類的成員函數(shù)可以被繼承,可以通過派生類的對象訪問,但這僅僅指的是普通的成員函數(shù),類的構(gòu)造函數(shù)不能被繼承。構(gòu)造函數(shù)不能被繼承是有道理的,因為即使繼承了,它的名字和派生類的名字也不一樣,不能成為派生類的構(gòu)造函數(shù),當然更不能成為普通的成員函數(shù)。

    2024年02月10日
    瀏覽(21)
  • Matlab論文插圖繪制模板第43期—直方圖(histogram)

    Matlab論文插圖繪制模板第43期—直方圖(histogram)

    在之前的文章中,分享過很多 柱狀圖的Matlab繪制模板 : 這一次,來分享一種比較特殊的柱狀圖: 統(tǒng)計直方圖 。 先來看一下 成品效果 : 特別提示 :Matlab論文插圖繪制模板系列, 旨在降低大家使用Matlab進行科研繪圖的門檻 ,只需按照模板格式添加相應(yīng)內(nèi)容,即可得到滿足

    2024年02月15日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包