谁能解释一下为什么下面的代码可以在GCC上编译,而不能在Visual Studio中编译?
我得到错误C2244: 'MyTemplate::List':无法将函数定义匹配到已存在的声明。
#include <array>
enum class MyEnum
{
MAX = 5,
};
template<typename E>
class MyTemplate
{
public :
static const int NUMBER = static_cast<int>(E::MAX);
std::array<int, NUMBER> List();
};
template<typename E>
std::array<int, MyTemplate<E>::NUMBER> MyTemplate<E>::List() // ERROR
{
return std::array<int, MyTemplate<E>::NUMBER>();
}
int main()
{
MyTemplate<MyEnum> myClass;
}
我认为这是一些非标准的东西,我正在做GCC允许和VS不,但我不知道是什么。CLion对代码也很满意。
给出这个答案,也有可能是VS中的一个bug,尽管具体细节不同,但错误信息是相同的。在我的例子中,模板看起来很简单,只包含一个参数,没有嵌套。
作为变通方法,您可以使用:
template<typename E>
auto MyTemplate<E>::List()
-> std::array<int, NUMBER>
{
return std::array<int, MyTemplate<E>::NUMBER>();
}
演示