Использование необъявленного идентификатора в C++ с шаблонами и наследованием [дубликат]

этот вопрос уже есть ответ здесь:

следующий код не может компилироваться-использование необъявленного идентификатора. Я использую 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 ответов


попробовать

this->addStuff(thingy);

есть несколько вопросов:

  1. отсутствует точка с запятой после определения класса.
  2. отсутствует тип для doSomething объявление/определение метода.
  3. отсутствует тип для определения addStuff метод.

после исправления этого это, кажется, работает.

Edit: как вы исправили синтаксические ошибки и он все еще не работает. Как и другие, ваш компилятор может потребовать, чтобы вы вызвали addStuff метод this-> префикс:

this->addStuff(thingy);

Это связано с наследованием шаблонов. В таком случае вы должны указать, используя для базовых методов:

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); 
}

используйте этот указатель для вызова метода addStuff i.e

this->addStuff(thingy);