use*_*745 12 c++ inheritance templates
以下代码无法编译 - 使用未声明的标识符.我使用GCC和XCode进行编译.
一切都在一个头文件中.
include "MyArray.h"
template <typename T>
class MyBase {
public:
MyBase();
virtual ~MyBase();
void addStuff(T* someStuff);
protected:
MyArray<T*> stuff;
};
template <typename T>
MyBase<T>::MyBase() {}
template <typename T>
MyBase<T>::~MyBase() {}
template <typename T>
void MyBase<T>::addStuff(T* someStuff) {
stuff.add(someStuff);
}
// ---------------------
template <typename T>
class MyDerived : public MyBase<T> {
public:
MyDerived();
virtual ~MyDerived();
virtual void doSomething();
};
template <typename T>
MyDerived<T>::MyDerived() {}
template <typename T>
MyDerived<T>::~MyDerived() {}
template <typename T>
void MyDerived<T>::doSomething() {
T* thingy = new T();
addStuff(thingy); //here's the compile error. addStuff is not declared.
}
Run Code Online (Sandbox Code Playgroud)
有人有解释吗?提前致谢!
jua*_*nza 25
尝试
this->addStuff(thingy);
Run Code Online (Sandbox Code Playgroud)
这是由于模板继承。在这种情况下,您应该手动指定 using for base 方法:
template <typename T>
MyDerived<T>::doSomething() {
using MyBase<T>::addStuff;
T* thingy = new T();
addStuff(thingy);
}
Run Code Online (Sandbox Code Playgroud)
或者通过这个指针来做:
template <typename T>
MyDerived<T>::doSomething() {
T* thingy = new T();
this->addStuff(thingy);
}
Run Code Online (Sandbox Code Playgroud)
有几个问题:
doSomething方法声明/定义的类型.addStuff方法.修好之后似乎有效.
编辑:由于您已修复语法错误,但仍然无法正常工作.正如其他人建议你的编译器可能要求你addStuff用this->前缀调用方法:
this->addStuff(thingy);
Run Code Online (Sandbox Code Playgroud)