带有派生模板类和继承成员变量的语法拼图

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++没有,并建议可能的解决方法?

Tar*_*ama 5

由于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 .