这个程序有范围问题吗?
#include<iostream>
using namespace std;
template<class Type>
class Base
{
public:
Type member;
Base(Type param): member(param){
}
};
template<class Type>
class Derived: public Base<Type>
{
public:
Derived(Type param):Base<Type>(param){
// ^
// |_______ Not writing Type here gives error, why?
}
void display()
{
cout << member; /** ERROR HERE **/
}
};
int main()
{
Derived<int> p(5);
p.display();
return 0;
}
我得到错误 'member' was not declared in this scope
。如何解决问题?
最佳答案
您的问题有点令人困惑。一开始我以为你问的是base<Type>
在成员初始化列表中,那么我以为你问的是访问 member
,然后回到第一个...现在我想你是在问两个问题,所以我会回答两个问题。
Not writing Type here gives error, why?
当您使用类模板的名称 ( my_class_templ
) 时,它指的是 模板,它不是类型。为了将其用作类型,您需要提供模板参数( my_class_templ<int>
、 my_class_templ<T>
)。因此,无论何时需要类型名称(包括初始化列表中的基类名称),您都需要提供模板参数。
对于类模板定义中的类模板名称,您可以省略模板参数列表。例如,复制构造函数可以声明为
my_class_templ(const my_class_templ& rhs);
代替
my_class_templ<T>(const my_class_templ<T>& rhs);
这只是一个小语法糖,可以让您减少输入。
但是,在类模板定义之外,您需要明确拼出所有模板参数。对于派生类也是如此:
my_dervied_class_templ(const my_derived_class_templ& rhs)
: my_class_templ<T>(rhs) // need to spell out <T> here
{
}
I get error
'member' was not declared in this scope
. How to fix the problems?
当编译器第一次遇到您的模板时,只有它的定义,编译器还没有看到任何实例化。编译器不知道在实例化时,模板在范围内是否有特殊化。但是,您可以将模板专门用于 Base<T>::member
指代其他事物或不完全定义。 (比如,特化 Base<void>
没有数据成员。)因此,编译器不得推测 Base
的成员。 .因此,它们不会在 Derived
中查找。 .
这样做的结果是,如果您需要引用 Base
的其中一位成员, 你需要告诉编译器你期望一个 Base<T>
有这样的成员。这是通过完全限定其名称来完成的:Base<Type>::member
.
关于c++ - 模板 C++ 中的范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829040/