考虑这个最小的例子:
template<class X> struct foo;
template<>
struct foo<int>
{
template<class = void>
static constexpr int x = 0;
};
template<class T>
constexpr int foo<int>::x<T>;
最后两行是必需的,否则我们将在变量x
被ODR使用时获得未定义的引用。
虽然gcc(6.2.1)很乐意编译这段代码,但clang(3.9.0)在最后一行失败了这条神秘的消息:
错误:变量模板部分特化没有专门化 任何模板参数;要定义主模板,请删除 模板参数列表
哪一个是正确的行为?
答案 0 :(得分:4)
最后两行代码应为:
template<class T>
const int foo<int>::x;
或
template<class T>
constexpr int foo<int>::x;
喜欢this