boost :: make_shared <T>(...)不编译,shared_ptr <T>(new T(...))

eud*_*xos 5 boost shared-ptr c++11

我在使用时遇到g ++ 4.6和boost 1.42的编译错误boost::make_shared<T>(...),而shared_ptr<T>(new T(...))编译得很好.遗憾的是,我无法隔离一个最小的例子(我尝试编译的任何内容都适合两者),但也许有人可以向我解释差异.

我正在实例化一个实例shared_ptr<ResidualsFunctor> f,其中ResidualsFunctor有以下ctor:

ResidualsFunctor(int,int,StaticEquilibriumSolver*)
Run Code Online (Sandbox Code Playgroud)

这个

f=shared_ptr<ResidualsFunctor>(new ResidualsFunctor(0,0,this)); // this is a StaticEquilibriumSolver*
Run Code Online (Sandbox Code Playgroud)

编译得很好,而

f=make_shared<ResidualsFunctor>(0,0,this); 
Run Code Online (Sandbox Code Playgroud)

告诉我:

/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&&)
Run Code Online (Sandbox Code Playgroud)

这是助推器中的一个错误吗?在gcc?我的错,我没看到?

Nic*_*las 4

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

您的问题似乎是转发整数参数时遇到困难。我不知道如何,因为你所有的论点都是基本类型。

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