在类模板中定义变量模板

时间:2016-12-20 09:08:51

标签: c++ gcc clang c++14

考虑这个最小的例子:

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)在最后一行失败了这条神秘的消息:

  

错误:变量模板部分特化没有专门化   任何模板参数;要定义主模板,请删除   模板参数列表

哪一个是正确的行为?

1 个答案:

答案 0 :(得分:4)

最后两行代码应为:

template<class T>
const int foo<int>::x;

template<class T>
constexpr int foo<int>::x;

喜欢this