【问题标题】:boost::make_shared<T>(...) does not compile, shared_ptr<T>(new T(...)) doesboost::make_shared<T>(...) 无法编译, shared_ptr<T>(new T(...)) 可以
【发布时间】:2011-08-01 08:39:45
【问题描述】:

我在使用boost::make_shared&lt;T&gt;(...) 时遇到 g++4.6 和 boost 1.42 的编译错误,而 shared_ptr&lt;T&gt;(new T(...)) 编译得很好。不幸的是,我无法隔离一个最小的示例(我尝试编译的任何内容都适用于两者),但也许有人可以向我解释其中的区别。

我正在创建 shared_ptr&lt;ResidualsFunctor&gt; f 的实例,其中 ResidualsFunctor 具有以下 ctor:

ResidualsFunctor(int,int,StaticEquilibriumSolver*)

这个

f=shared_ptr<ResidualsFunctor>(new ResidualsFunctor(0,0,this)); // this is a StaticEquilibriumSolver*

编译得很好,而

f=make_shared<ResidualsFunctor>(0,0,this); 

告诉我:

/usr/include/boost/smart_ptr/make_shared.hpp: In function 'boost::shared_ptr<T> boost::make_shared(Args&& ...) [with T = StaticEquilibriumSolver::ResidualsFunctor, Args = int, int, StaticEquilibriumSolver* const]':
pkg/sparc/SparcField.cpp:472:49:   instantiated from here
/usr/include/boost/smart_ptr/make_shared.hpp:148:5: error: no matching function for call to 'forward(int&)'
/usr/include/boost/smart_ptr/make_shared.hpp:148:5: note: candidate is:
/usr/include/boost/smart_ptr/make_shared.hpp:90:40: note: template<class T> T&& boost::detail::forward(T&&)

这是 boost 中的错误吗?在 gcc 中?我的错我看不出来?

【问题讨论】:

  • 这看起来像是 Boost 的 std::forward 和你的编译器之间的奇怪交互。您使用的是什么编译器版本,您使用的是什么版本的 Boost?
  • 问题中指定,g++4.6和boost 1.42。

标签: boost c++11 shared-ptr


【解决方案1】:

boost::make_shared 使用给定的参数分配给定类型的对象并将其包装在boost::shared_ptr 中。因此,它必须将您给它的参数转发给构造函数。为了让你调用它工作,它必须能够找到一个与你给它的参数列表相匹配的构造函数。

您的问题似乎是转发您的整数参数有困难。我不确定如何,因为您的所有论点都是基本类型。

Boost 1.42 于 18 个月前发布; GCC 4.6 的发布时间比这更晚。我猜如果你更新到更新版本的 Boost,你就不会遇到这个问题了。

【讨论】:

  • boost::make_shared 在其他情况下工作得很好,这就是为什么我不明白这里发生了什么......
  • @euxodos - 在这 18 个月中,转发和右值引用的规则发生了变化。似乎编译器和库是根据不同的规则集编码的。
  • 我无法更新 boost 系统范围的 ATM,但我很高兴问题的根源很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
相关资源
最近更新 更多