Подтвердить что ты не робот

Наследование шаблона С++

Я новый программист в С++. и я использую шаблоны в первый раз.

У меня есть абстрактный класс и другой класс, расширяющий его. но все защищенные члены абстрактного класса не распознаются другим классом:

class0.h:

template<class T>
class class0 {

protected:
    char p;
public:
    char getChar();
};

**class1.h**
template<class T>
class class1:public class0<T> {
public:
    void printChar();
};
template<class T>
void class1<T>::printChar(){
    cout<< p<<endl;//p was not declared in this scope
}

Благодарю вас. имеют отличную неделю =)

4b9b3361

Ответ 1

Причина, по которой это происходит, связана с правилами поиска шаблонов.

p не является зависимым выражением, потому что это просто идентификатор, а не что-то, что зависит от параметра шаблона. Это означает, что базовые классы, зависящие от параметра шаблона, не будут найдены, чтобы разрешить имя p. Чтобы обойти эту проблему, вам нужно использовать что-то, что зависит от параметра шаблона. Использование this-> сделает это.

например.

cout << this->p << endl;

Ответ 2

Для поиска имени в зависимом базовом классе необходимо выполнить два условия

  • Необходимо, чтобы поиск не был неквалифицирован
  • Необходимо, чтобы имя зависело

Эти правила, как указано в С++ 03, отличаются от правил обозначенных неконфигурированным С++ 98, где выполняется вторая пуля ( делая зависимым от имени) было достаточно для поиска имен, объявленных в зависимых базовых классах.

Зависимое имя просматривается во время создания экземпляра, и поиск, отличный от неквалифицированного поиска, не будет игнорировать зависимые базовые классы. Оба этих условия должны быть удовлетворены, чтобы найти имя, объявленное в зависимом базовом классе, ни один из них не является достаточным. Чтобы удовлетворить оба условия, вы можете использовать различные конструкции

this->p
class1::p

Оба имени p зависят, и первая версия использует поиск доступа к членам класса, а вторая версия использует квалифицированный поиск имени.

Ответ 3

Я не получаю эту ошибку компилятора в VC9. Тем не менее, есть несколько проблем с кодом: во-первых, он не должен быть классом шаблона, как он писал в настоящее время... но, может быть, вы просто упростили его для этого вопроса? Во-вторых, базовый класс должен иметь виртуальный деструктор.

#include <iostream>

using namespace std;

class class0 {
public:
   virtual ~class0(){}

protected:
    char p;
public:
    char getChar();
};

class class1 : public class0 {
public:
    void printChar();
};

void class1::printChar(){
    cout << p << endl;//p was not declared in this scope
}

int main() {
   class1 c;
   c.printChar();
   return 1;
}

Поскольку вы изучаете шаблоны, я предлагаю не смешивать понятия (наследование и шаблоны) во время обучения. Начните с простого примера, подобного этому...

#include <iostream>
#include <string>

using namespace std;

template <typename T>
T add(const T& a, const T& b) {
   return a + b;
}

int main() {
   int x = 5;
   int y = 5;

   int z = add(x, y);
   cout << z << endl;

   string s1("Hello, ");
   string s2("World!");

   string s3 = add(s1, s2);
   cout << s3 << endl;

   return 1;
}

Важным понятием в коде выше является то, что мы написали функцию ONE, которая знает, как добавлять целые числа и строки (и многие другие типы, если на то пошло).