我有一个模板类,我想声明一个与该类相同类型的静态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'
答案 0 :(得分:1)
您的}
模板类型的最后Test
之前是不完整的。
这里的very similar question添加了第三个编译器。如您所见,答案说VC ++和clang遵守标准,而gcc则不这样做。