当我实现一个数据结构时,我遇到了以下使用未声明的标识符“a”的问题。 a不是继承自基类吗?为什么我无法访问?
#pragma once
#include <iostream>
template <typename T> class A {
public:
T a;
virtual void show() = 0;
};
template <typename T> class B : public A<T> {
public:
B() { a = 0; }
void show() { std::cout << "Hello, world!" << std::endl; }
};
但是当我添加this指针时,并没有出现错误信息:
#pragma once
#include <iostream>
template <typename T> class A {
public:
T a;
virtual void show() = 0;
};
template <typename T> class B : public A<T> {
public:
B() { this->a = 0; }
void show() { std::cout << "Hello, world!" << std::endl; }
};
为什么???
当您编写
this->a
时,您明确告诉编译器在当前实例的范围内查找成员 a
。这有助于编译器正确解析名称,即使在具有潜在范围模糊性的模板上下文中也是如此。
在你的第一个例子中;
B() { a = 0; }
编译器在类
a
的构造函数中遇到 B
,并尝试在类 a
的范围内查找 B
。但是,由于 a
是从类 A<T>
继承的,因此它被视为依赖名称,需要使用 this->
来指示正确的范围。
在你的第二个例子中;
B() { this->a = 0; }
您明确使用
this->a
来指示 a
是当前实例的成员。这解决了范围歧义,并让编译器知道 a
是从基类继承的。