windows - 使用 std::bind 的代码无法编译,错误 C2780:需要 6 个参数 - 提供了 8 个参数

标签 windows visual-studio-2012 c++11

考虑代码:

#include <functional>
#include <vector>
#include <stdint.h>

class CFileOperationWatcher
{
public:
    CFileOperationWatcher() {}

    virtual void onProgressChanged(uint64_t sizeProcessed, uint64_t totalSize, size_t numFilesProcessed, size_t totalNumFiles, uint64_t currentFileSizeProcessed, uint64_t currentFileSize) {}

    virtual ~CFileOperationWatcher() {}

    void onProgressChangedCallback(uint64_t sizeProcessed, uint64_t totalSize, size_t numFilesProcessed, size_t totalNumFiles, uint64_t currentFileSizeProcessed, uint64_t currentFileSize) {
        _callbacks.emplace_back(std::bind(&CFileOperationWatcher::onProgressChanged, this, sizeProcessed, totalSize, numFilesProcessed, totalNumFiles, currentFileSizeProcessed, currentFileSize));
    }

protected:
    std::vector<std::function<void ()> > _callbacks; 
};

int main(int argc, char *argv[])
{
    CFileOperationWatcher w;
    w.onProgressChangedCallback(0,0,0,0,0,0);
}

我在 Visual Studio 2012 中收到错误 C2780。看起来没有可以接受这么多参数的 std::bind 定义。但它不是应该使用可变参数模板并接受任意数量的参数吗?

最佳答案

MSVC++ 2012 有依赖于宏机制的虚假可变参数模板。默认情况下,它们最多仅适用于 5 个参数。如果您需要更多,可以使用_VARIADIC_MAX最多可设置 10 个参数。

这是一个similar question .

VC++ 在 2013 版本中添加了可变参数模板。

关于windows - 使用 std::bind 的代码无法编译,错误 C2780:需要 6 个参数 - 提供了 8 个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18279036/

相关文章:

asp.net - 如何在客户端获取当前登录的 Windows 用户 ID

c - Windows下的全局异常处理程序(访问冲突)

c# - 如何从 .Net Core 3 创建 Windows 服务

visual-studio - 在构建项目时将内容文件输出到特定文件夹

c++ - 如何创建支持 initializer_list 的 std::vector 子类?

c++ - 从特定字符串中取出 double

java - 如何将Java资源文件转换为byte[]?

entity-framework - ADO.NET 实体数据模型自动生成的代码违反代码分析 CA2214

c# - 使用 linq 过滤列表中的相似项目

c++ - 显式选择复制分配