VC++ 可变模板模板错误 C2244:无法将函数定义与现有声明匹配

VC++ Variadic-Template-Template error C2244: unable to match function definition to an existing declaration

本文关键字:定义 声明 函数 错误 C2244 VC++      更新时间:2023-10-16
这可能是

新手的错误,我正在使用Microsoft Visual C++编译器2012年11月CTP,当我尝试编译它时:

#include <tuple>
class A
{
public:
    template <class... Fs, template <class...> class T>
    void foo(T<Fs...>);
};
template <class... Fs, template <class...> class T>
void A::foo(T<Fs...>)
{
}
int main()
{
    A a;
    a.foo(std::make_tuple(10,10));
}

我收到以下错误:

error C2244: 'A::foo' : unable to match function definition to an existing declaration
definition
'void A::foo(T<Fs...>)'
existing declarations
'void A::foo(T<Fs...>)'

如果我内联函数,它会编译并执行我想做的事情,但我必须将函数放在头文件中

但是以下代码编译没有错误:

#include <vector>
class A
{
public:
    template <class Fs, template <class> class T>
    void foo(T<Fs>);
};
template <class Fs, template <class> class T>
void A::foo(T<Fs>)
{
}
int main()
{
    A a;
    a.foo(std::vector<int>());
}

所以问题是我如何使用可变参数模板实现同样的事情

编辑:

按照建议,在 Microsoft 连接 ID :771567 提交错误报告

向量示例也很糟糕(它会给出<std::_Simple_types<int>,std::_Vector_val>,但它确实可以编译),但是如果您尝试使用一对和模板参数:

template <class F, class G, template <class,class> class T>

你会得到<F,G,std::pair>这就是我的意思

来自 MSDN 关于编译器错误 C2244:

不能部分专用化函数模板。

我还认为你必须在全班面前声明template

template<typename T>
class MyClass
{
};