C++ 当我们';你在尝试实例化一个模板吗?
守则:C++ 当我们';你在尝试实例化一个模板吗?,c++,templates,specialization,C++,Templates,Specialization,守则: #include <iostream> template<int N> struct A { int a = A<1>::a; }; int main() { } #包括 模板 结构A { int a=a::a; }; int main(){} 对无效,但对有效。什么行为才是真正正确的?标准对此并不十分清楚: N4296::14.7.1/1[临时安装] 除非已明确指定类模板专用化 实例化(14.7.2)或显式专门化(14.7.3),类
#include <iostream>
template<int N>
struct A
{
int a = A<1>::a;
};
int main() { }
#包括
模板
结构A
{
int a=a::a;
};
int main(){}
对无效,但对有效。什么行为才是真正正确的?标准对此并不十分清楚:
N4296::14.7.1/1[临时安装]
除非已明确指定类模板专用化
实例化(14.7.2)或显式专门化(14.7.3),类
当
专门化是在需要
完全定义的对象类型或类的完整性
类型影响程序的语义
这是无效代码,因为
A
在使用点的类型不完整。您对本标准的引用不相关(A
不能在使用时实例化)
如果你有,情况会有所不同
template<int> struct A;
template<> struct A<1> { static int a; };
template<> struct A<2>
{
int a=A<1>::a; // fine: A<1> has complete type
};
模板结构A;
模板结构A{static int A;};
模板结构A
{
int a=a::a;//很好:a具有完整的类型
};
此外,在原始代码中,您认为A::A
或A::A
的值应该是多少?任何地方都没有办法给它赋值。你声称gcc编译了这个,但是什么是A:A
?垃圾空的
正如R Sahu在评论中指出的那样,您的代码还受到一个事实的影响,即您不能在没有对象的情况下访问成员
A::A
(除非它是静态
成员)
关于接触成员的问题
在您的注释引用的代码中,该成员作为对象的成员被隐式访问
*this
。因此,在类A
(或任何派生类)中,A::A
与this->A
相同。但是您必须在外部提供对象。这是无效代码,因为A
在使用点的类型不完整。您对本标准的引用不相关(A
不能在使用时实例化)
如果你有,情况会有所不同
template<int> struct A;
template<> struct A<1> { static int a; };
template<> struct A<2>
{
int a=A<1>::a; // fine: A<1> has complete type
};
模板结构A;
模板结构A{static int A;};
模板结构A
{
int a=a::a;//很好:a具有完整的类型
};
此外,在原始代码中,您认为A::A
或A::A
的值应该是多少?任何地方都没有办法给它赋值。你声称gcc编译了这个,但是什么是A:A
?垃圾空的
正如R Sahu在评论中指出的那样,您的代码还受到一个事实的影响,即您不能在没有对象的情况下访问成员
A::A
(除非它是静态
成员)
关于接触成员的问题
在您的注释引用的代码中,该成员作为对象的成员被隐式访问
*this
。因此,在类A
(或任何派生类)中,A::A
与this->A
相同。但在外部必须提供一个对象。除非A::A
是一个静态成员变量,否则不能这样做。@RSahu不太清楚原因。我们正在访问非静态成员的初始值设定项。初始化语句的RHS不能是A::A
,除非A
是A
的静态数据成员,或者A
是A
@RSahu的父类,但无论如何,在类成员规范中,该类在函数体、默认参数、使用引入继承构造函数(12.9)、异常规范的声明以及非静态数据成员(包括嵌套类中的此类内容)的大括号或相等初始值设定项时被视为是完整的。
因此,如果使用,是吗?@RSahu此外,可以按照我在帖子中引用的方式使用非静态数据成员。看看我很困惑……除非A::A
是一个静态成员变量,否则不能这样做。@RSahu不太清楚为什么。我们正在访问非静态成员的初始值设定项。初始化语句的RHS不能是A::A
,除非A
是A
的静态数据成员,或者A
是A
@RSahu的父类,但无论如何,在类成员规范中,该类在函数体、默认参数、使用引入继承构造函数(12.9)、异常规范的声明以及非静态数据成员(包括嵌套类中的此类内容)的大括号或相等初始值设定项时被视为是完整的。
因此,如果使用,是吗?@RSahu此外,可以按照我在帖子中引用的方式使用非静态数据成员。看看我很困惑。。。