【问题标题】:C2244: 'MyTemplateClass<T>::MyFunction': unable to match function definition to an existing declarationC2244:“MyTemplateClass<T>::MyFunction”:无法将函数定义与现有声明匹配
【发布时间】:2021-11-01 16:27:35
【问题描述】:

谁能解释一下为什么下面的代码可以在 GCC 上编译,但不能在 Visual Studio 中编译。

我得到 error C2244: 'MyTemplate::List': unable to match function definition to an existing declaration 在注明的行。

#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 对代码也很满意。

鉴于this 的回答,它也可能是VS 中的一个错误,虽然具体情况不同,但错误消息是相同的。然而,在我的例子中,模板看起来很简单,只涉及一个参数并且没有嵌套。

【问题讨论】:

    标签: c++ gcc visual-c++


    【解决方案1】:

    作为解决方法,您可以使用:

    template<typename E>
    auto MyTemplate<E>::List()
    -> std::array<int, NUMBER>
    {
        return std::array<int, MyTemplate<E>::NUMBER>();
    }
    

    Demo

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多