Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我们';你在尝试实例化一个模板吗?_C++_Templates_Specialization - Fatal编程技术网

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此外,可以按照我在帖子中引用的方式使用非静态数据成员。看看我很困惑。。。