c++ - VS2015错误C2976

标签 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;
}

最佳答案

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

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

关于c++ - VS2015错误C2976,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956725/

相关文章:

C++ 11 的 C++ 编译问题

C++ 运行时字符串格式化

visual-studio - 是一种在 Visual Studio 中重置 nuget 超时的方法吗?

visual-studio - Visual Studio 调试工具提示

c++ - 在课后使用 typedef ClassName< >

c++ - 如何禁用QT中的最大化按钮?

c++ - 为什么 STL 算法 for_each 两次调用我的仿函数的析构函数?

visual-studio - Java IDE 与 Microsoft IDE

c++11 - C++ 为什么在 move 构造函数和 move 赋值运算符的上下文中需要 noexcept 来启用优化?

c++11 - C++ - 可变参数模板部分特化