16

以下代码无法编译 - 使用未声明的标识符。我使用 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.
}

有人有解释吗?提前致谢!

4

4 回答 4

34

尝试

this->addStuff(thingy);
于 2012-05-24T10:29:23.043 回答
7

这是由于模板继承。在这种情况下,您应该手动指定使用基本方法:

template <typename T>
MyDerived<T>::doSomething() {
  using MyBase<T>::addStuff;
  T* thingy = new T();
  addStuff(thingy); 
}

或者通过这个指针来做:

template <typename T>
MyDerived<T>::doSomething() {
  T* thingy = new T();
  this->addStuff(thingy); 
}
于 2012-05-24T10:33:18.477 回答
6

有几个问题:

  1. 类定义后缺少分号。
  2. 缺少doSomething方法声明/定义的类型。
  3. 缺少addStuff方法定义的类型。

修复后它似乎工作

编辑:因为您已经修复了语法错误,但它仍然无法正常工作。正如其他人所建议的那样,您的编译器可能会要求您使用前缀调用该addStuff方法:this->

this->addStuff(thingy);
于 2012-05-24T10:32:29.370 回答
3

使用这个指针来调用 addStuff 方法,即

this->addStuff(thingy);
于 2012-05-24T10:34:32.953 回答