2009-09-03 114 views
36

我在我的程序中使用boost共享指针,并且我有一个类作为参数引用另一个对象。我碰到的问题是make_shared函数要求所有参数都是一个const引用,如果我的类的构造函数不允许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:错误:没有匹配函数调用`对象:对象(const int的&)” 注:考生:对象:对象(const对象&) 注:对象:对象(INT &)

如果对象构造函数的参数是一个const int,则可以使用。我很好奇为什么make_shared的行为如此。

+0

你能告诉我们一些代码来演示如何使用'make_shared()'吗? – quamrana 2009-09-03 15:06:48

+0

的代码片段发布 – 2009-09-03 15:20:58

回答

42

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html说:“如果您需要将非const引用传递给T的构造函数,则可以通过将参数包装到boost :: ref调用中来实现。该页面上的其他文字似乎支持RüdigerHanke的回答。

+0

真棒,谢谢我真的不想在下面使用我的解决方法。 – 2009-09-03 15:58:37

0

虽然我仍然不知道为什么提高make_shared对我施加这个限制,我找到了解决办法。如果我将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来说似乎很奇怪,因为这个限制对我来说很重要,尽管我认为这在大多数情况下可能是一个坏主意。

8

不能说他的功能的作者,但是...你必须做出选择。如果该函数使用非const引用,那么您无法将const对象传递给采用const引用的构造函数。

根据我的经验,采用const引用的构造函数比采用可变引用的构造函数要普遍得多。

构造函数可以有n参数,所以你不能只提供一个单一的重载,但必须考虑到const/non-const的任何组合,这会导致你需要的重载指数爆炸, d想要为它们提供重载。 C++ 0x和完美的转发应该为我认为的这个问题提供一个解决方案。

+0

完美的解释。谢谢。 – 2009-09-03 15:57:45

1

您需要定义一个复制构造函数。

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; 
    } 
}; 
4

直到rvalue references(参见“转发问题”一节)到达C++ 0x中,完美的转发是不可能的。 make_shared只是尽其所能地做到最好。

+0

+1有人实际上发布了一个解释,为什么这是,而不仅仅是使用boost :: ref(..):) – Nils 2013-12-06 17:58:46

0

您可以通过使对象构造函数explicit来修复它。