2

这可能是新手的错误,我正在使用 Microsoft Visual C++ Compiler Nov 2012 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 Connect 上提交了错误报告,ID 为:771567

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

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

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

4

1 回答 1

0

来自 MSDN 关于编译器错误 C2244

您不能部分特化函数模板。

我也认为你必须template在类前面声明:

template<typename T>
class MyClass
{
};
于 2014-04-12T19:39:05.073 回答