这是代码示例,它可以重现我的问题:
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)
它工作正常.尽管不确定为什么我需要指定所有模板参数.
可能重复:
C++继承的模板类无权访问基类
我遇到了模板和继承问题.简单地说,我有一个模板类,我希望从中继承另一个模板类.我不明白为什么基类的成员在派生类中不可见?虽然不使用模板,但一切都按预期工作.例如:
template <typename T>
class Foo
{
public:
T x;
T y;
void doX(){ x = x+1; }
void doY(){y++;}
protected:
T a;
T b;
void doA(){a++;}
};
template <typename T>
class Bar : public Foo<T>
{
public:
void doX(){x++; y++;} // ERROR
void doY(){x++; y++;} // ERROR
void doA(){a++;b++;} // ERROR
};
Run Code Online (Sandbox Code Playgroud)