尝试了解名称何时在当前实例化中
Trying to understand when a name is in the current instantiation
我在尝试运行某些代码中的细微错误时遇到了这种情况。
template<typename T>
struct S
{
int f(){ return this->r; }
int g(){ return r; }
};
编译器在S::g
的定义上标记了一个错误,即使我从未实例化模板的专用化,这实际上是我所期望的:名称 r 是非限定的,并且未在范围内的任何地方声明。
令我困惑的是,在我实例化一个专业化(例如CT<int>f
(并调用其f
之前,错误不会在S::f
的定义上标记
。换句话说,编译器似乎将this
视为指向依赖类型的指针,而不是指向当前实例化的指针。
这是对的吗?(我的编译器是 g++ 8.1.0(。如果 g++ 在做正确的事情,你能解释一下吗?
有两种类型的模板代码。 您有依赖和非依赖代码,即依赖于模板参数的代码和不依赖于模板参数的代码。 在
int g(){ return r; }
没有什么取决于T
所以编译器检查出代码,看看它无效,你得到一个错误。
在
int f(){ return this->r; }
r
现在取决于T
,因为this
取决于T
。 由于在知道T
是什么之前,您无法知道它是否有效,因此代码被"忽略",并且只有在实际实例化后才会收到错误。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- 何时需要实例化函数模板定义?
- 尝试了解名称何时在当前实例化中
- 在显式实例化期间,不完整的类型何时可以?
- 模板非静态数据成员初始化程序何时实例化
- 相对于模板实例化计算static_assert何时
- 何时会隐式实例化导致问题
- 何时实例化类模板的 vitual 方法
- 何时检查C++模板实例化类型
- 在定义上下文或实例化点中,何时进行非依赖名称的重载解析
- 隐式模板实例化何时发生