[英]specialising templated constructor of a non-template class
如何专门化非模板类的模板化构造函数? 下面的代码可以用 gcc 和 icc 编译,但不能用 clang 和 msvc 编译。
代码是 a) 非法但 icc/gcc 编译它还是 b) 是合法的,但由于某种原因,clang/msvc 无法编译。
复制人:
$ cat template_01.cpp
struct A
{
template<class T>
A(T const &t);
};
template<>
A::A<double>(double const& t) {}
int main()
{
A a(42.0);
}
复现步骤:
$ clang++ template_01.cpp
template_01.cpp:8:4: error: qualified reference to 'A' is a constructor name rather than a type wherever a constructor can be declared
A::A<double>(double const& t) {}
^
template_01.cpp:8:5: error: expected unqualified-id
A::A<double>(double const& t) {}
^
2 errors generated.
$
$ g++ template_01.cpp
$
$ icc template_01.cpp
$
$ cl.exe template_01.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.40629 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
template_01.cpp
template_01.cpp(8) : error C2143: syntax error : missing ';' before '<'
template_01.cpp(8) : error C2988: unrecognizable template declaration/definition
template_01.cpp(8) : error C2059: syntax error : '<'
template_01.cpp(11) : error C2143: syntax error : missing ';' before '{'
template_01.cpp(11) : error C2447: '{' : missing function header (old-style formal list?)
$
我相信,这是 CLang 中的一个错误。 标准中没有任何内容可以阻止构造函数的显式专业化,并且 gcc 中的类似问题被认为是一个错误:
我通过搜索找到了这里,TC提到的链接有最终决定权(2019年)。
现在确定在构造函数模板特化中“不应指定模板参数”。 即以下代码有效:
template<>
A::A(double const& t) {}
我已经确认 GCC 和 Clang 现在都接受它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.