C2244: "MyTemplateClass::<T>MyFunction": 无法将函数定义与现有声明匹配



谁能解释一下为什么下面的代码可以在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>();
}

演示

最新更新