我在使用boost::make_shared<T>(...)
时遇到g ++ 4.6编译错误和增强1.42,而shared_ptr<T>(new T(...))
编译得很好。遗憾的是我无法隔离一个最小的例子(我尝试编译的任何东西都适用于两者),但也许有人可以向我解释差异。
我正在设置shared_ptr<ResidualsFunctor> f
的实例,其中ResidualsFunctor
包含以下代码:
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&&)
这是助推器中的错误吗?在gcc?我的错,我没看到?
答案 0 :(得分:4)
boost::make_shared
使用给定的参数分配给定类型的对象,并将其包装在boost::shared_ptr
中。因此,它必须将您提供给它的参数转发给构造函数。为了使你的调用工作,它必须能够找到一个与你给它的参数列表相匹配的构造函数。
您的问题似乎是转发整数参数有困难。我不确定如何,因为你的所有论据都是基本类型。
Boost 1.42于18个月前发布; GCC 4.6的发布比最近更新。我想如果你更新到更新版本的Boost,你就不会遇到这个问题。