Наследование шаблона С++
Я новый программист в С++. и я использую шаблоны в первый раз.
У меня есть абстрактный класс и другой класс, расширяющий его. но все защищенные члены абстрактного класса не распознаются другим классом:
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
}
Благодарю вас. имеют отличную неделю =)
Ответы
Ответ 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, которая знает, как добавлять целые числа и строки (и многие другие типы, если на то пошло).