Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 - Fatal编程技术网

C++ 写入模板类型';是否有效;构造函数声明中的参数列表?

C++ 写入模板类型';是否有效;构造函数声明中的参数列表?,c++,templates,C++,Templates,旧的GCC 4.1.2和新的GCC 4.5.1,包括以下程序 但这真的正确吗?标准是怎么说用类型的模板参数声明构造函数的 (我觉得很有趣,我不被允许这样做。) #包括 模板 结构Foo{ Foo();//我将把我最近在圣诞节寄出的一份可能的医生的邮件副本放在这里 以下代码是否格式正确 template<typename T> struct A { A<T>(); }; 模板 结构A{ A(); }; 我测试的几个编译器(clang、g++和comeau conli

旧的GCC 4.1.2和新的GCC 4.5.1,包括以下程序

但这真的正确吗?标准是怎么说用类型的模板参数声明构造函数的

(我觉得很有趣,我不被允许这样做。)

#包括
模板
结构Foo{

Foo();//我将把我最近在圣诞节寄出的一份可能的医生的邮件副本放在这里

以下代码是否格式正确

template<typename T>
struct A {
  A<T>();
};
模板
结构A{
A();
};
我测试的几个编译器(clang、g++和comeau conline) 接受这一点。事实上,12.1并不禁止这一点(
A
是它的一个名称) 类,而不是typedef名称),但8.3p1表示

声明器id中出现的非限定id应为简单 标识符,但某些特殊功能的声明除外(12.3, 12.4,13.5)

构造函数是一个特殊的成员函数,但是 参考文件不包括12.1。这是否意味着上述代码 是格式错误?还是这是一个意外遗漏

如果在越界定义中执行相同操作,则将尝试将模板参数传递给构造函数。这是有效代码

struct A {
  template<typename T> A();
};

template<> A::A<int>() { }
结构A{ 模板A(); }; 模板A::A(){}

该规范规定,在查看类的范围时,如果在限定名称中使用注入的类名(就像在
a::a
中一样),那么当名称查找接受函数/构造函数名称时,注入的类名引用将被转换为解析为该类的构造函数(如果名称查找上下文仅接受类型,则名称将保留为注入的类名,并表示类类型)。在
A::A
之后,名称查找完成并生成构造函数。
只能作为模板参数列表进行分析。如果构造函数中没有模板,则代码将无效。

FWIW,也在GCC 4.6.1上生成和运行。可能是由于12.1/1:“语法使用……构造函数的类名…”,这个问题相当于“is
Foo
类名?”@SteveJessop:…“如果是的话,为什么它在定义中不被接受?”@Tomalak:是的。我不知道它怎么可能是名称(或者是名称的一个版本)在一个范围内,而不是在另一个范围内,所以这在我看来肯定是错误的,我只是缺少证明它的引用。该标准确实禁止使用
typedef
别名来代替名称,因此它肯定不仅仅是“解析到类的任何标识符都是正确的”。@SteveJessop:14.6.1/1与正常(非模板)一样类,类模板有一个注入的类名(第9条)。injectedclass-name可以用作模板名称或类型名称…'因此,我认为类名不是模板id,而是模板名称。第一段似乎暗示给定的代码是有效的。但是,呃……OP询问的是模板类的常规构造函数,而不是模板构造函数。(
a::a()
i.s.o.
A::A()
)@xtofl我想你误解了我的答案。在我的邮件复印件之后,我详细阐述了OP问题的一部分(我发现有趣的是,我不允许在越界定义中做同样的事情。)。第一段(引用代表我的邮件)这意味着代码被GCC、clang和comeau在线编译器接受。这并不意味着代码是有效的。对不起,我是个聪明人,但你能为我总结一下吗?@tomalak总结是:不要这样做,不清楚是否正式允许,委员会还没有决定。更准确地说,这不是tem如果没有模板,则显示参数列表,但由于此处允许的表达式不少于,因此没有其他路径,因此会发生解析错误。编译器非常聪明,可以恢复将
解释为模板参数列表。我更新了答案,以正确反映语义。
struct A {
  template<typename T> A();
};

template<> A::A<int>() { }