Вопрос по c++, inheritance – Использование необъявленного идентификатора в C ++ с шаблонами и наследованием [duplicate]

10

This question already has an answer here:

templates: parent class member variables not visible in inherited class 3 answers

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

У кого-нибудь есть объяснение? Заранее спасибо!

@jua, тебе определенно нужно искать проклятые зависимые базовые правила поиска для неквалифицированных имен. то, что вы говорите, неверно. соответствующий компилятор потребует этого. Johannes Schaub - litb

Ваш Ответ

4   ответа
1

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

this->addStuff(thingy);
20

пытаться

this->addStuff(thingy);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user1414745
Error: User Rate Limit ExceededisError: User Rate Limit ExceededwillError: User Rate Limit Exceeded
Error: User Rate Limit ExceededandError: User Rate Limit Exceeded
Error: User Rate Limit ExceededknowError: User Rate Limit Exceeded
5

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

  1. Missing semicolons after class definitions.
  2. Missing type for doSomething method declaration/definition.
  3. Missing type for definition of addStuff method.

После исправленияпохоже на работу.

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

this->addStuff(thingy);
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededThe Dreaded Two-Phase Name Lookup
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededthis->Error: User Rate Limit Exceeded
3

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

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

Похожие вопросы