VS2015错误C2976

时间:2016-04-30 15:28:32

标签: c++ visual-studio c++11 visual-studio-2015 variadic-templates

VisualStudio无法编译此代码(错误C2976)

但是GCC和Clang可以编译这段代码

为什么???

#include <iostream>
#include <map>

template <typename... ARGS>
void Func(const std::map<ARGS...>& m)
{
    //...
}

template <typename T>
void Func(const T& t)
{
    //...
}

int main()
{
    std::map<int, double> m;
    Func(m);    // error C2976: 'std::map': too few template arguments
    Func(123);  // OK
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我的猜测是,这是因为Visual Studio 2015不完全支持嵌套的可变参数模板,并且无法正确推断出类型。

作为一项解决方法,您必须明确指定类型,因此您可以使用Func<std::map<int, double>>(m);Func<int, double>(m);甚至Func<decltype(m)>(m);(我推荐最后一个)。