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
在类模板的定义或类模板的成员中,如果类模板的基类依赖于模板参数,则在类的定义时,在非限定名称查找期间不会检查基类作用域.模板或成员或在类模板或成员的实例化期间.
以下代码应该有效.
template <typename InterfaceType>
void ChildClass<InterfaceType>::set()
{
Base<std::vector<InterfaceType> >::myOption = 10;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20375 次 |
| 最近记录: |