2011-08-01 22 views
5

estoy consiguiendo error de compilación con g ++ 4.6 y 1.42 impulso al utilizar boost::make_shared<T>(...), mientras que compila solo shared_ptr<T>(new T(...)) multa. Lamentablemente, no puedo aislar un ejemplo mínimo (todo lo que probé compilado muy bien para ambos), pero tal vez alguien podría explicarme la diferencia.impulso :: make_shared <T> (...) no se compila, shared_ptr <T> (nuevo T (...)) hace

estoy instatiating una instancia de shared_ptr<ResidualsFunctor> f, donde ResidualsFunctor tiene la siguiente ctor:

ResidualsFunctor(int,int,StaticEquilibriumSolver*) 

Este

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

compila bien, mientras que

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

me dice:

/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&&) 

¿Es un error en el impulso? En gcc? ¿Mi culpa que no veo?

+1

Parece una interacción extraña entre el equivalente de Boost de 'std :: forward' y su compilador. ¿Qué versión de compilador estás usando y qué versión de Boost estás usando? –

+0

Se especifica en la pregunta, g ++ 4.6 y boost 1.42. – eudoxos

Respuesta

4

boost::make_shared asigna un objeto del tipo dado, usando los parámetros dados y lo envuelve en un boost::shared_ptr. Por lo tanto, tiene que reenviar los argumentos que le das a un constructor. Para que su llamada funcione, debe ser capaz de encontrar un constructor que coincida con la lista de argumentos que le proporcione.

Su problema parece ser que tiene dificultades para reenviar sus argumentos enteros. No estoy seguro de cómo, ya que todos tus argumentos son tipos básicos.

Boost 1.42 fue lanzado hace 18 meses; GCC 4.6 fue lanzado más recientemente que eso. Supongo que si actualizas a una versión más reciente de Boost, no tendrías este problema.

+0

'boost :: make_shared' funciona bien en otros casos, es por eso que no entiendo lo que está pasando aquí ... – eudoxos

+1

@euxodos - Las reglas para el reenvío y las referencias rvalue han cambiado durante estos 18 meses. Parece que el compilador y la biblioteca están codificados contra diferentes conjuntos de reglas. –

+0

No soy capaz de actualizar todo el sistema ATM, aunque estoy contento de que el origen del problema esté claro. – eudoxos

Cuestiones relacionadas