我有一个std :: shared_ptr向量的typedef,如下所示:
typedef std::vector<std::shared_ptr<Foo> > FooMap;
然后我有一个Bar
类,其中FooMap
成员声明为:
FooMap _foos;
Bar
构造函数如下所示:
Bar::Bar(FooMap& foos) : _foos(foos) {}
我也尝试过:
Bar::Bar(FooMap& foos) : _foos(std::move(foos)) {}
两者都不会编译。我明白了:
error: no match for call to
‘(FooMap {aka std::vector<std::shared_ptr<Foo> >}) (FooMap&)’
或:
error: no match for call to
‘(FooMap {aka std::vector<std::shared_ptr<Foo> >})
(std::remove_reference<std::vector<std::shared_ptr<Foo> >&>::type)
分别
当我调用Bar
构造函数时,我从另一个类中获取FooMap:
FooMap foo = baz1.foos();
然后
Bar bar(foo);
Baz
类foos()
方法是:
const FooMap& Baz::foos() const { return myFooMap; }
移动构造函数我仍然想弄清楚,但我绝对不能理解为什么第一个不使用std :: vector复制构造函数。
我误解了什么?
答案 0 :(得分:2)
以下是一个完美无缺的例子:
#include <memory>
#include <vector>
class Foo {
};
typedef std::vector<std::shared_ptr<Foo> > FooMap;
class Bar {
public:
Bar(FooMap & foos):
foos_(foos)
{}
private:
FooMap foos_;
};
int main() {
FooMap f = { std::make_shared<Foo>(), std::make_shared<Foo>() };
Bar b(f);
}