boost make_shared需要一个const引用。 任何方式来解决这个问题?
我在我的程序中使用boost共享指针,我有一个类作为参数引用另一个对象。 我碰到的问题是make_shared函数要求所有参数是一个常量引用,如果我的类的构造函数不允许const引用参数传入,我会得到编译错误。
有没有人知道背后的原因? 另外,我能做些什么来解决这个问题吗?
什么是给我的问题的代码示例:
class Object { public: Object(int& i) { i = 2; } }; int main(int argc, char *argv[]) { int i = 0; boost::shared_ptr<Object> obj = boost::make_shared<Object>(i); return 1; }
这会导致编译器错误,指出以下内容
:make_shared.hpp:185:错误:没有匹配的函数调用Object :: Object(const int&)注:候选是:Object :: Object(const Object&)注:Object :: Object(int&
如果对象构造函数的参数是一个const int,这个工作。 我很好奇为什么make_shared的行为如此。
http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html说:“如果你需要传递一个非const引用给T的构造函数,你可以通过包装参数在一个调用boost :: ref。“ 该页面上的其他文字似乎支持RüdigerHanke的回答。
不能说他的function的作者,但是…你必须做出select。 如果函数使用非const引用,则不能将const对象传递给使用const引用的构造函数。
以我的经验,使用const引用的构造函数比使用可变引用的构造函数要普遍得多。
构造函数可以有n
参数,所以你不能只提供一个重载,但是必须考虑const / non-const的任何组合,这会导致如果你想要提供的重载指数爆炸所有的重载。 C ++ 0x和完美的转发应该为这个问题提供一个解决scheme,我认为。
直到右值引用 (请参阅“转发问题”一节)以C ++ 0x到达,完美转发几乎是不可能的。 make_shared
只是尽其所能地做到最好。
你需要定义一个拷贝构造函数。
class Object { public: Object(const Object& original) { // Copy original to new object // The reason for the const is this should not change the original }; Object(int& i) { i = 2; } };
虽然我仍然不知道为什么提高make_shared对我施加这个限制,我find了解决办法。 如果我传入一个参数的指针的const引用,我可以改变指针。 这里是代码片段:
class Object { public: Object(int* const& i) { *i = 2; } }; int main(int argc, char *argv[]) { int i = 0; boost::shared_ptr<Object> obj = boost::make_shared<Object>(&i); cout << i << "\n"; return 1; }
这个就像一个魅力。 任何人都有任何想法,为什么我需要跳过这些箍? 对于make_shared来说似乎很奇怪,因为这个限制在我身上,尽pipe我认为这在大多数情况下可能是一个坏主意。
您可以通过使Object构造函数明确来修复它。