C++ 为什么可以';我是否使用父类的变量,即模板类?

C++ 为什么可以';我是否使用父类的变量,即模板类?,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

a、 h

模板
甲级
{
公众:
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();
};