使用点之后模板函数的特化会破坏编译
考虑下一个示例:
#include <iostream>
template< int a >
void foo();
int main(int argn, char* argv[])
{
foo<1>();
}
template<>
void foo<1>()
{
std::cout<<1<<std::endl;
}
编译失败并显示下一个错误消息:
rg.cpp:12: error: specialization of ‘void foo() [with int a = 1]’ after instantiation
标准中的哪一段解释了此错误?
PS:我知道如果我将函数定义移到 main 前面将使错误消失。
Consider next example :
#include <iostream>
template< int a >
void foo();
int main(int argn, char* argv[])
{
foo<1>();
}
template<>
void foo<1>()
{
std::cout<<1<<std::endl;
}
The compilation fails with next error messages :
rg.cpp:12: error: specialization of ‘void foo() [with int a = 1]’ after instantiation
What paragraph in the standard explains this error?
PS :I know that if I move the function definition in front of main will make the error go away.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为根据标准,这是未定义的行为。在 UB 的情况下,工具链可以做什么没有限制,生成编译器错误是更友好的可能性之一。
[temp.spec]
部分,14.7p5 说[temp.expl.spec]
14.7.3p6 节说:您的程序违反了这些要求。
I think that's undefined behavior according to the standard. There are no restrictions on what a toolchain can do in cases of UB, generating a compiler error is one of the friendlier possibilities.
Section
[temp.spec]
, 14.7p5 saysSection
[temp.expl.spec]
14.7.3p6 says:Your program violates these requirements.