2

考虑代码:

#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可以接受这么多参数的定义。但是它不应该使用可变参数模板并接受任意数量的参数吗?

4

3 回答 3

2

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

这是一个类似的问题

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

于 2013-08-16T21:45:32.227 回答
1

这与 clang (3.3) 可以很好地编译,所以它必须是 VS2012 的编译器错误。是的,你是对的:std::bind()是可变参数模板(C++11),另见http://en.cppreference.com/w/cpp/utility/functional/bind

于 2013-08-16T17:47:24.523 回答
1

Visual Studio 2012 不支持可变参数模板。另一方面,Visual Studio 2013 将根据.

于 2013-08-16T19:41:34.540 回答