亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GCC問題:使用依賴于模板參數的基類成員

GCC問題:使用依賴于模板參數的基類成員

C++
有只小跳蛙 2019-12-04 10:28:50
以下代碼無法使用gcc進行編譯,但是可以使用Visual Studio進行編譯:template <typename T> class A {public:    T foo;};template <typename T> class B: public A <T> {public:    void bar() { cout << foo << endl; }};我得到了錯誤:test.cpp:在成員函數'void B :: bar()'中:test.cpp:11:錯誤:未在此范圍內聲明'foo'但是應該!如果我更改bar為void bar() { cout << this->foo << endl; }那么它確實可以編譯,但是我認為我不必這樣做。GCC遵循的C ++正式規范中是否有某些內容,還是只是一個怪癖?
查看完整描述

3 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

這在gcc-3.4中已更改。C ++解析器在該發行版中變得更加嚴格-按照規范,但是對于具有舊版或多平臺代碼庫的人來說仍然有些煩人。


查看完整回答
反對 回復 2019-12-04
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

編譯時的問題B<T>在于,A<T>編譯器無法知道其基類(它是模板類),因此編譯器無法從基類中了解任何成員。


較早的版本通過實際解析基本模板類進行了一些推斷,但是ISO C ++指出,這種推斷會導致本不應該存在的沖突。


在模板中引用基類成員的解決方案是使用this(就像您一樣)或專門命名基類:


template <typename T> class A {

public:

    T foo;

};


template <typename T> class B: public A <T> {

public:

    void bar() { cout << A<T>::foo << endl; }

};


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 433 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號