"未在此范围内声明"模板和继承错误

Tad*_*zys 26 c++ inheritance templates compiler-errors g++

这是代码示例,它可以重现我的问题:

template <typename myType>
class Base {
public:
    Base() {}
    virtual ~Base() {}
protected:
    int myOption;
    virtual void set() = 0;
};

template <typename InterfaceType>
class ChildClass : public Base < std::vector<InterfaceType> >
{
public:
    ChildClass() {}
    virtual ~ChildClass() {}
 protected:
    virtual void set();
};

template <typename InterfaceType>
void ChildClass<InterfaceType>::set()
{
     myOption = 10;
}
Run Code Online (Sandbox Code Playgroud)

我的用法main():

ChildClass<int> myObject;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误(ubuntu上的gcc 4.4.3):

'myOption'未在此范围内声明

如果我的ChildClass没有新的模板参数,这将工作正常,即:

class ChildClass : public Base < std::vector<SomeConcreteType> >
Run Code Online (Sandbox Code Playgroud)

编辑

如果我的set方法如下所示,我已设法解决它:

Base<std::vector<InterfaceType> >::myOption = 10;
Run Code Online (Sandbox Code Playgroud)

它工作正常.尽管不确定为什么我需要指定所有模板参数.

ybu*_*ill 45

myOption不是依赖名称,即它不依赖于模板参数,因此编译器会尽早查找它.你必须使它成为一个从属名称:

template <typename InterfaceType>
void ChildClass<InterfaceType>::set()
{
     this->myOption = 10;
}
Run Code Online (Sandbox Code Playgroud)

现在它取决于this模板参数的类型,从而取决于模板参数的类型.因此,编译器将在实例化时绑定它.

这称为两阶段名称查找.


Eri*_*c Z 14

C++ 03 14.6.2从属名称

在类模板的定义或类模板的成员中,如果类模板的基类依赖于模板参数,则在类的定义时,在非限定名称查找期间不会检查基类作用域.模板或成员或在类模板或成员的实例化期间.

以下代码应该有效.

template <typename InterfaceType>
void ChildClass<InterfaceType>::set()
{
   Base<std::vector<InterfaceType> >::myOption = 10;
}
Run Code Online (Sandbox Code Playgroud)

  • (修辞问题)很好,但_why_? (5认同)