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

quot;not declared in this scopequot; error with templates and inheritance(“未在此范围内声明模板和继承错误)
本文介绍了“未在此范围内声明"模板和继承错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

这是重现我的问题的代码示例:

Here is code sample which reproduces my problem:

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;
}

我在main()中的用法:

ChildClass<int> myObject;

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

I get the following error (gcc 4.4.3 on ubuntu):

'myOption' 未在此范围内声明

‘myOption’ was not declared in this scope

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

If my ChildClass would be without new template parameter this would work fine, i.e.:

class ChildClass : public Base < std::vector<SomeConcreteType> >

<小时>

编辑

我已经设法解决它,如果我的 set 方法看起来像:


Edit

I've managed to solve it, if my set method looks like:

Base<std::vector<InterfaceType> >::myOption = 10;

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

It works fine. Still though not sure why I need to specify all template parameters.

推荐答案

myOption 不是依赖名称,即它不显式依赖模板参数,因此编译器会尝试查找它早期的.您必须将其设为依赖名称:

myOption is not a dependent name, i.e. it doesn't depend on the template arguments explicitly so the compiler tries to look it up early. You must make it a dependent name:

template <typename InterfaceType>
void ChildClass<InterfaceType>::set()
{
     this->myOption = 10;
}

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

Now it depends on the type of this and thus on the template arguments. Therefore the compiler will bind it at the time of instantiation.

这称为两阶段名称查找.

这篇关于“未在此范围内声明"模板和继承错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)