GCC 陷阱:使用模板參數依賴關係存取基類成員
此程式碼在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; } };
GCC 引發錯誤:“foo' 未在此範圍內聲明”,儘管它是基類的成員。但是,修改程式碼以透過「this->foo」明確引用基類成員可以解決該問題。
說明
GCC 遵循 C 標準,該標準禁止在模板編譯期間推斷基類成員。在早期版本中,GCC 透過解析基底類別來推斷成員,但這可能會導致衝突。
要解決此問題,請確保在範本中明確存取基類成員:
使用「this」引用成員:
void bar() { cout << this->foo << endl; }
指定基類名稱:
void bar() { cout << A<T>::foo << endl; }
透過遵循根據這些準則,開發人員可以防止編譯錯誤並確保GCC 按範本內的預期處理基類成員訪問。更多詳細資訊請參閱 GCC 手冊。
以上是為什麼在存取模板中的基類成員時,GCC 會拋出'未聲明”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!