Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将唯一的_ptr传递给函数对象_C++_C++11 - Fatal编程技术网

C++ 将唯一的_ptr传递给函数对象

C++ 将唯一的_ptr传递给函数对象,c++,c++11,C++,C++11,在编译下面的代码时遇到问题。我创建一个函数对象并尝试传递一个唯一指针,但编译器抱怨说我试图访问unique_ptr中的私有数据。这发生在msvc 2012 v110中 class Work { }; class A { public: void doWork(Work w) { std::cout << " - - "; return; } void doWork2(std::unique_ptr<Work

在编译下面的代码时遇到问题。我创建一个函数对象并尝试传递一个唯一指针,但编译器抱怨说我试图访问unique_ptr中的私有数据。这发生在msvc 2012 v110中

class Work
{
};

class A 
{
public:

    void doWork(Work w)
    {
        std::cout << " - - ";
        return;
    }

    void doWork2(std::unique_ptr<Work> w)
    {
        std::cout << " - - ";
        return;
    }
};

int main()
{
    A a;
    std::unique_ptr<Work> w2 = std::unique_ptr<Work>(new Work());

    Work w;
    auto func = std::bind(&A::doWork, a, std::placeholders::_1);
    auto func2 = std::bind(&A::doWork2, a, std::placeholders::_1);
    func(w);
    func2(std::move(w2));
    return 0;
}
课堂作业
{
};
甲级
{
公众:
空榫(工作w)
{

std::cout这看起来像是VC中的一个bug。另请参阅

VC似乎将占位符参数作为左值引用传递,而不是使用完美转发

该示例在gcc()上编译得很好

作为一种解决方法,您可以使用lambda而不是
std::bind

auto func2 = [&a](std::unique_ptr<Work> w) { a.doWork2(std::move(w)); };
autofunc2=[&a](std::unique_ptr w){a.doWork2(std::move(w));};

MinGW下的代码编译得很好。是否包含头文件?由于std::unique\u ptr是不可复制的,可能MSVS10很难确定该调用是否应该是直接初始化,或者您正在尝试使用私有std::unique\u ptr(const unique\u ptr)您可以尝试使用brace init list,这样您就可以在gcc上很好地编译std::unique_ptr w2{new Work{}};了