首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模板继承c++

模板继承c++
EN

Stack Overflow用户
提问于 2010-09-27 03:45:42
回答 4查看 15.4K关注 0票数 17

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

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

类0.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
}

谢谢。祝你一周愉快=)

EN

回答 4

Stack Overflow用户

发布于 2010-09-27 03:54:12

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

p不是依赖表达式,因为它只是一个标识符,而不是依赖于模板参数的东西。这意味着不会搜索依赖于模板参数的基类来解析名称p。为了解决这个问题,你需要使用一些依赖于模板参数的东西。使用this->可以做到这一点。

例如:

cout << this->p << endl;
票数 26
EN

Stack Overflow用户

发布于 2010-09-27 04:56:08

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

名称依赖于unqualified

  • It's ,查找不是必需的,这是必要的

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

依赖名称是在实例化时查找的,而非非限定查找不会忽略依赖基类。要找到在依赖基类中声明的名称,需要满足这两个条件,单凭这两个条件是不够的。要同时满足这两个条件,可以使用各种构造

this->p
class1::p

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

票数 16
EN

Stack Overflow用户

发布于 2010-09-27 04:07:53

我在VC9中没有得到那个编译器错误。然而,代码有几个问题:首先,它不需要是一个模板类,因为它目前是written...but也许你只是为了这个问题简化了它?其次,基类应该有一个虚拟析构函数。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3799495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档