为什么我不能使用msvc在模板类中声明静态constexpr变量?

时间:2019-05-24 17:22:24

标签: c++ visual-studio templates gnu constexpr

我有一个模板类,我想声明一个与该类相同类型的静态constexpr变量。使用gnu编译器,它可以正常工作,但是 Microsoft Visual Studio,它将无法编译。我是在做错什么,是我对gnu编译器很友善,还是Microsoft编译器出了问题? 我知道我可以解决这个问题,可以更改功能相同的函数的变量,但我很好奇。

template <typename T>
constexpr T One() noexcept { return static_cast<T>( 1 ); }

template <typename T>
struct Test {
    T val;

    static constexpr Test example{ One<T>() };                    // compiles only with gnu
    static constexpr Test Example() { return Test{ One<T>() }; }  // compiles with both gnu and microsoft
};

给定的错误(Visal Studio 2017)是:

  

错误C2017:使用未定义的类型'Test'

1 个答案:

答案 0 :(得分:1)

您的}模板类型的最后Test之前是不完整的。

这里的very similar question添加了第三个编译器。如您所见,答案说VC ++和clang遵守标准,而gcc则不这样做。