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的行为如此。

不能说他的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构造函数明确来修复它。