-1

我有这样的代码:

#include <memory>
#include <vector>

namespace daq
{

class Animal
{
public:
    Animal(){};
};

class Pig : public Animal
{
public:
    Pig() : Animal () {};
};

class Farm
{
public:
    void addAnimal(Animal& animal)
    {
        mAnimals.push_back(std::unique_ptr<Animal>(animal)); // error
    }

private:
    std::vector<std::unique_ptr<Animal>> mAnimals;
};
} /* namespace daq */

但是我在方法 Farm::addAnimal 中遇到错误:

没有匹配函数调用'std::unique_ptr::unique_ptr(daq::Animal&)'</p>

我应该将什么传递给 push_back 方法?

4

1 回答 1

3

Aunique_ptr接受一个指针作为构造函数参数,但您传递的是一个引用。这基本上是编译器告诉你的:你不能std::unique_ptr从 a 构造 a daq::Animal&

您可以将原始指针传递给使用Animal分配的类型的对象new,或者(最好)您应该以这种方式传递unique_ptr构造并在将其作为参数提供时从它移开push_back()

void addAnimal(std::unique_ptr<Animal>&& animal)
//                                    ^^
//                                    This is to make it absolutely clear that
//                                    your intention is to bind to an object
//                                    the client wants to move from. It is not
//                                    especially needed here (unique_ptr is not
//                                    copyable), but it makes your interface
//                                    more explicit about it. [Credits to sehe]
{
    mAnimals.push_back(std::move(animal)); // OK
}

int main()
{
    daq::Farm farm;
    std::unique_ptr<daq::Animal> pig(new daq::Pig());
    farm.addAnimal(std::move(pig)); // OK
}

您必须在std::move()此处使用,因为unique_ptrs 是不可复制的,因此您有效地将所有权pig从调用它的例程转移到包含它的向量(addAnimal()作为此转移的中间人)。

于 2013-03-29T13:28:36.063 回答