Pau*_*l R 2 c++ inheritance templates g++ visual-c++
在移植一些Windows遗留代码并尝试使用gcc/clang进行编译时,我遇到了以下问题,我并不完全理解:
template<typename T> class Base
{
public:
Base() {}
T m_var;
};
template<typename T> class Derived : public Base<T>
{
public:
Derived()
{
#if 1
Base<T>::m_var = 0; // fix - compiles with gcc/clang now
#else
m_var = 0; // original - compiles only with MSVC++
#endif
}
};
Run Code Online (Sandbox Code Playgroud)
gcc/clang的错误是:
错误:使用未声明的标识符'm_var'
不幸的是,有数百个地方在派生类方法中引用了非限定成员变量,我真的不想改变所有这些,以便Base<T>::在我能帮助它们时它们是合格的.
任何人都可以解释为什么gcc/clang似乎需要这个,而MSVC++没有,并建议可能的解决方法?
由于Base<T>是依赖库,因此无法通过非限定查找访问其成员.如您所述,您可以通过它们访问它们Base<T>::m_var.另一种选择是this->m_var.
我不确定这是一个简洁的解决方法.一种选择是将T& m_var;数据成员添加到Derived并初始化以引用Base<T>::m_var.如果您不能使用额外的引用成员,则可以在T& m_var = this->m_var;具有不合格m_var访问权限的任何函数的开头添加a .