boost :: make_shared <T>(...) не компилируется, shared_ptr <T>(new T (...)) - PullRequest
5 голосов
/ 01 августа 2011

Я получаю ошибку компиляции с g ++ 4.6 и повышение 1.42 при использовании boost::make_shared<T>(...), тогда как shared_ptr<T>(new T(...)) компилируется просто отлично.Я, к сожалению, не могу выделить минимальный пример (все, что я пытался скомпилировать, отлично подходит для обоих), но, возможно, кто-то может объяснить мне разницу.

Я утверждаю экземпляр shared_ptr<ResidualsFunctor> 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&&)

Это ошибка в бусте?В gcc?Моя вина, которую я не вижу?

1 Ответ

4 голосов
/ 01 августа 2011

boost::make_shared выделяет объект данного типа, используя заданные параметры, и переносит его в boost::shared_ptr.Следовательно, он должен пересылать аргументы, которые вы передаете, конструктору.Чтобы ваш вызов работал, он должен быть в состоянии найти конструктор, который соответствует списку аргументов, который вы ему даете.

Похоже, ваша проблема в том, что он испытывает затруднения при пересылке ваших целочисленных аргументов.Я не уверен, как, поскольку все ваши аргументы являются базовыми типами.

Boost 1.42 был выпущен 18 месяцев назад;GCC 4.6 был выпущен сравнительно недавно.Я предполагаю, что если вы обновите более позднюю версию Boost, у вас не возникнет этой проблемы.

...