Использование необъявленного идентификатора в 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 ответов
есть несколько вопросов:
- отсутствует точка с запятой после определения класса.
- отсутствует тип для
doSomething
объявление/определение метода. - отсутствует тип для определения
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);
}