模板继承c ++

时间:2010-09-26 19:45:42

标签: c++ templates inheritance

我是c ++的新程序员。我第一次使用模板。

我有一个抽象类和另一个扩展它的类。但是抽象类的所有受保护成员都不被其他类识别:

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 个答案:

答案 0 :(得分:26)

发生这种情况的原因与模板的查找规则有关。

p不是依赖表达式,因为它只是一个标识符,而不是依赖于模板参数的东西。这意味着将不会搜索依赖于模板参数的基类来解析名称p。要解决此问题,您需要使用取决于模板参数的内容。使用this->即可。

e.g。

cout << this->p << endl;

答案 1 :(得分:15)

对于要在依赖基类中查找的名称,需要满足两个条件

  • 必要查找不合格
  • 该名称依赖必要

C ++ 03中陈述的这些规则与rules stated by unrevised C++98不同,其中满足第二个项目符号(使名称依赖)足够用于查找在依赖基类中声明的名称。

在实例化时查找依赖名称,除非非限定查找之外的查找不会忽略依赖基类。需要满足这两个条件才能找到在依赖基类中声明的名称,它们中的任何一个都不够。要满足这两个条件,您可以使用各种构造

this->p
class1::p

两个名称p都是相关的,第一个版本使用类成员访问查找,第二个版本使用限定名称查找

答案 2 :(得分:2)

我在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 函数,该函数知道如何添加整数和字符串(以及其他许多类型)。

答案 3 :(得分:0)

很抱歉恢复了这么老的问题,但我只想添加一些我觉得有价值的东西,如果你有很多很多的东西,那就是#34; p&#34;在你的会员职能中。

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