C++ 为什么可以';我是否使用父类的变量,即模板类?
a、 hC++ 为什么可以';我是否使用父类的变量,即模板类?,c++,templates,inheritance,C++,Templates,Inheritance,a、 h 模板 甲级 { 公众: INTA; } b、 h 模板 B类:公共A { 公众: int f(); } 模板 intb::f() { int t; t=this->a;//好的 t=a//错误 返回0; } 当我不使用此->时,为什么会发生错误 我能用某种方法省略这个->吗 (我修正了一些错误)模板实例化有两个阶段(“两阶段名称查找”) 在第一阶段,解析(查找)所有非依赖名称。在第二阶段,将解析从属名称 从属名称是依赖于模板参数的名称,例如: template <typena
模板
甲级
{
公众:
INTA;
}
b、 h
模板
B类:公共A
{
公众:
int f();
}
模板
intb::f()
{
int t;
t=this->a;//好的
t=a//错误
返回0;
}
当我不使用此->
时,为什么会发生错误
我能用某种方法省略这个->
吗
(我修正了一些错误)模板实例化有两个阶段(“两阶段名称查找”) 在第一阶段,解析(查找)所有非依赖名称。在第二阶段,将解析从属名称 从属名称是依赖于模板参数的名称,例如:
template <typename T>
class B : public A<T>
{
public:
int f();
}
template <typename T>
int B<T>::f()
{
int t;
t = this->a; //Okay
t = a //Error
return 0;
}
这正是我所描述的。在OK术语中,t
在第2阶段查找,
因为此
依赖于模板参数
错误术语在阶段1中查找,因为该名称中的任何内容都不依赖于模板参数。
但是在第1阶段,没有可见的a
,因为编译器无法内省基类模板
在阶段1中,由于模板可以在实例化时进行专门化,
它可以远离主模板声明,这是另一个专门化
没有a
,可能可见
例如:
t = this->a; //Okay
t = a //Error
模板
结构基{
};
模板
派生结构:基{
void foo(){
this->a=0;//这是有效的。`this->a`在第2阶段中查找。
}
};
模板结构基{
INTA;
};
int main()
{
//以下声明触发第2阶段查找。
派生di;//有效,因为后面的
//使用Base和所有符号
//问题解决了。
派生的df;//无效
}
顺便说一句,我曾经在我的低频博客上写过。
B
是一个模板,因此它的名称是非依赖的,因此必须在定义模板时查找,而不是在实例化模板时查找。但是,在定义模板时,依赖名称未知(可能存在基类模板A
的专门化,目前尚未见到),编译器无法将非限定名称解析为基类。您可以通过this->
限定将名称引入当前范围,方法是在名称前面加上A::
或使用声明加上:
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main ()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
模板
B类:公共A
{
公众:
使用A::A;
int f();
};
还要注意的是,在类声明和标有//Error
注释的行后面缺少分号。Joachim Pileborg给出了答案。除此之外,提供的代码还存在其他问题,无法编译。这是实际代码吗?类定义后没有尾随分号,int B:f()
的作用域运算符不正确,并且错误行没有分号。噢,这只是键入错误。我把它固定了。“从属的名字不知道”->这在C++语言中是没有意义的。名称可能是从属名称,也可能不是从属名称,例如,对于typename T,A::x
是从属名称,x
不是从属名称。作为程序员,x
是一个依赖名称,这对您来说可能是有意义的,但从技术上讲,x
不是一个依赖名称。-1:“它的名称是非依赖的,因此必须进行查找”->这是错误的。可以有依赖的成员名称。示例:抱歉,“…依赖名称无法解析(…),这就是为什么编译器无法确定它是在基类中定义的”可能更合适。但我担心即使这样也不完全正确。Microsofts编译器曾经这样做过,因为如果名称存在于可见的模板中,这是可能的,但标准禁止这样做,因为它可能会获取不正确的符号(假设您在主模板中有一个值成员“m”,而在专用模板中,您有一个类型名“m”;使用microsofts old compiler,这将导致错误的程序)。依赖名是不依赖于模板参数的名称->依赖名是依赖于模板参数的名称:)@Czyl:将近五年才发现这个错误:D谢谢你的提示:)
t = this->a; //Okay
t = a //Error
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main ()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
template <typename T>
class B : public A<T>
{
public:
using A<T>::a;
int f();
};