考虑下一个例子:
#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 前面将使错误消失。
我认为那是未定义的行为根据标准。在 UB 的情况下,工具链可以做什么没有限制,生成编译器错误是更友好的可能性之一。
Section [temp.spec]
,14.7p5 说
对于给定的模板和给定的一组模板参数,
- 显式实例化定义在程序中最多出现一次,
- 一个显式专业化在程序中最多定义一次(根据 3.2),并且
- 显式实例化和显式专业化声明都不应出现在
除非显式实例化遵循显式专业化的声明。
不需要实施来诊断是否违反此规则。
Section [temp.expl.spec]
14.7.3p6 说:
如果模板、成员模板或类模板的成员被显式专门化,则该专业化应在第一次使用该专业化之前声明,这将导致发生隐式实例化,在发生这种使用的每个翻译单元中;无需诊断。
您的程序违反了这些要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)