C++ 具有派生模板类和继承成员变量的语法难题

C++ 具有派生模板类和继承成员变量的语法难题,c++,templates,inheritance,visual-c++,g++,C++,Templates,Inheritance,Visual C++,G++,在移植一些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&

在移植一些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
    }
};
模板类基类
{
公众:
Base(){}
T m_var;
};
派生的模板类:公共基
{
公众:
派生的()
{
#如果1
Base::m_var=0;//修复-立即使用gcc/clang编译
#否则
m_var=0;//原始-仅使用MSVC编译++
#恩迪夫
}
};
gcc/clang的错误是:

错误:使用未声明的标识符“m_var”

不幸的是,派生类方法中引用了数百个非限定成员变量的位置,如果我能提供帮助的话,我真的不想改变所有这些位置,以便使用
Base::
限定它们

有人能解释为什么gcc/clang似乎需要这个,而MSVC++不需要,并建议可能的解决方法吗?

由于
Base
是一个依赖的Base,因此无法通过非限定查找访问其成员。正如您所指出的,您可以通过
Base::m_var
访问它们。另一个选项是
this->m_var


我不确定是否有一个简洁的解决方法。一种选择是增加一个
T&m_var数据成员到
派生的
,并将其初始化为引用
Base::m_var
。如果您不能与额外的引用成员生活在一起,您可以添加一个
t&m\u var=this->m\u var
到具有非限定
m_var
访问权限的任何函数的开头。

正如@TartanLlama所说,由于依赖于模板参数的基类型,该成员无法通过非限定查找。除了以
Base::m_var
this->m_var
的形式访问它之外,还有一种我非常喜欢的解决方法,因为对于要访问的每个类成员,它只需键入一次:


只需使用Base::m_var添加一个
派生的类定义
。通过这种方式,可以通过正常的名称查找找到
m_var

感谢您的简明解释-大概MSVC++在没有抱怨的情况下编译此文件是错误的?@PaulR很可能是的。我模模糊糊地记得几年前,g++并没有抱怨这种代码,当它开始执行规则时,我不得不修复一些类似的代码。@PaulR是的,这是因为它们缺少两阶段查找。成员只是在实例化时被查找,在检查完模板定义后被忽略。感谢您提供的解决方案建议-在本例中,
使用…
的想法非常完美,因为这意味着我可以避免破坏所有派生方法。@PaulR不客气!很抱歉,我可能会以稍微松散/非标准的方式使用相应的术语。我不太熟悉这里的标准语言。。。