наследование шаблонов с ++ - PullRequest
       6

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

16 голосов
/ 26 сентября 2010

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

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

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
}

спасибо.удачной недели =)

Ответы [ 4 ]

26 голосов
/ 26 сентября 2010

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

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

например

cout << this->p << endl;
15 голосов
/ 27 сентября 2010

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

2 голосов
/ 27 сентября 2010

Я не получаю эту ошибку компилятора в 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 функцию, которая знает, как добавлять целые числа и строки (и многие другиетипы в этом отношении).

0 голосов
/ 06 апреля 2018

Извините за возрождение такого старого вопроса, но я просто хотел добавить эту вещь, которую я считаю ценным, если у вас есть много-много "p" в ваших функциях-членах.

class class1:public class0<T> {
public:
    using class0<T>::p; // add this line and in all member functions 
                        // will assume that "p" is the p from class0<T>
                        // very useful if you have hundreds of "p":s
                        // and don't want to replace every single one with "this->p"
    void printChar();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...