在C++中使用未声明的标识符以及模板和继承

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)

  • @GiovanniBotta 我实际上找到了一个更好的副本,有更好的答案。请参阅问题标题下的链接。 (3认同)
  • @ JohannesSchaub-litb谢谢,我将不得不做一些阅读.我设法说服自己,这是对的*和*它是错的. (2认同)
  • 这对我来说太奇怪了!我也有点喜欢.你有一些文件/文章的链接解释为什么会这样吗? (2认同)

ink*_*boo 6

这是由于模板继承。在这种情况下,您应该手动指定 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)


Jur*_*aho 5

有几个问题:

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

修好之后似乎有效.

编辑:由于您已修复语法错误,但仍然无法正常工作.正如其他人建议你的编译器可能要求你addStuffthis->前缀调用方法:

this->addStuff(thingy);
Run Code Online (Sandbox Code Playgroud)