我是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
}
谢谢。祝你一周愉快=)
发布于 2010-09-27 03:54:12
发生这种情况的原因是与模板的查找规则有关。
p
不是依赖表达式,因为它只是一个标识符,而不是依赖于模板参数的东西。这意味着不会搜索依赖于模板参数的基类来解析名称p
。为了解决这个问题,你需要使用一些依赖于模板参数的东西。使用this->
可以做到这一点。
例如:
cout << this->p << endl;
发布于 2010-09-27 04:56:08
要在依赖基类中查找名称,需要满足两个条件
名称依赖于unqualified
C++03中声明的这些规则不同于rules stated by unrevised C++98,后者满足第二个项目符号(使名称依赖)就足以查找在依赖基类中声明的名称。
依赖名称是在实例化时查找的,而非非限定查找不会忽略依赖基类。要找到在依赖基类中声明的名称,需要满足这两个条件,单凭这两个条件是不够的。要同时满足这两个条件,可以使用各种构造
this->p
class1::p
两个名称p
都是依赖的,第一个版本使用类成员访问查找,第二个版本使用限定名称查找。
发布于 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函数,它知道如何添加整数和字符串(以及许多其他类型)。
https://stackoverflow.com/questions/3799495
复制相似问题