以下代碼無法使用gcc進(jìn)行編譯,但是可以使用Visual Studio進(jìn)行編譯:template <typename T> class A {public: T foo;};template <typename T> class B: public A <T> {public: void bar() { cout << foo << endl; }};我得到了錯(cuò)誤:test.cpp:在成員函數(shù)'void B :: bar()'中:test.cpp:11:錯(cuò)誤:未在此范圍內(nèi)聲明'foo'但是應(yīng)該!如果我更改bar為void bar() { cout << this->foo << endl; }那么它確實(shí)可以編譯,但是我認(rèn)為我不必這樣做。GCC遵循的C ++正式規(guī)范中是否有某些內(nèi)容,還是只是一個(gè)怪癖?
3 回答

搖曳的薔薇
TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
這在gcc-3.4中已更改。C ++解析器在該發(fā)行版中變得更加嚴(yán)格-按照規(guī)范,但是對于具有舊版或多平臺(tái)代碼庫的人來說仍然有些煩人。

ITMISS
TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
編譯時(shí)的問題B<T>在于,A<T>編譯器無法知道其基類(它是模板類),因此編譯器無法從基類中了解任何成員。
較早的版本通過實(shí)際解析基本模板類進(jìn)行了一些推斷,但是ISO C ++指出,這種推斷會(huì)導(dǎo)致本不應(yīng)該存在的沖突。
在模板中引用基類成員的解決方案是使用this(就像您一樣)或?qū)iT命名基類:
template <typename T> class A {
public:
T foo;
};
template <typename T> class B: public A <T> {
public:
void bar() { cout << A<T>::foo << endl; }
};
- 3 回答
- 0 關(guān)注
- 431 瀏覽
添加回答
舉報(bào)
0/150
提交
取消