以下代碼無法使用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 回答

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; }
};
- 3 回答
- 0 關注
- 433 瀏覽
添加回答
舉報
0/150
提交
取消