2011-08-01 12 views
5

otrzymuję błąd kompilacji z g ++ 4.6 i pobudzenia 1.42 przy użyciu boost::make_shared<T>(...), natomiast shared_ptr<T>(new T(...)) kompiluje tylko w porządku. Niestety nie jestem w stanie wyodrębnić minimalnego przykładu (wszystko, co starałem się skompilować dobrze dla obu), ale być może ktoś mógłby mi wyjaśnić różnicę.boost :: make_shared <T> (...) nie kompiluje, shared_ptr <T> (nowy T (...)) robi

ja instatiating wystąpienie shared_ptr<ResidualsFunctor> f, gdzie ResidualsFunctor posiada następujący konstruktor:

ResidualsFunctor(int,int,StaticEquilibriumSolver*) 

Ten

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

kompiluje dobrze, natomiast

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

mówi mi:

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

Czy to błąd w dopalaniu? W gcc? Moja wina, której nie widzę?

+1

Wygląda to na dziwną interakcję pomiędzy ekwipunkiem Boosta 'std :: forward' a twoim kompilatorem. Jakiej wersji kompilatora używasz i jakiej wersji Boost używasz? –

+0

Jest to określone w pytaniu, g ++ 4.6 i boost 1.42. – eudoxos

Odpowiedz

4

boost::make_shared przydziela obiekt danego typu, używając podanych parametrów i zawija go w boost::shared_ptr. Dlatego musi przekazywać argumenty, które podasz do konstruktora. Aby twoje wezwanie do działania zadziałało, musi być w stanie znaleźć konstruktor zgodny z podaną listą argumentów.

Twój problem polega na tym, że ma trudności z przekazywaniem argumentów całkowitych. Nie jestem pewien jak, ponieważ wszystkie twoje argumenty są podstawowymi typami.

Zwiększenie 1.42 zostało wydane 18 miesięcy temu; GCC 4.6 został wydany raczej niedawno. Przypuszczam, że jeśli zaktualizujesz nowszą wersję Boost, nie będziesz miał tego problemu.

+0

'boost :: make_shared' działa dobrze w innych przypadkach, dlatego nie rozumiem, co się tutaj dzieje ... – eudoxos

+1

@euxodos - Zasady przekazywania i referencji rvalue zmieniły się podczas tych 18 miesięcy. Wygląda na to, że kompilator i biblioteka są kodowane według różnych zestawów reguł. –

+0

Nie jestem w stanie zaktualizować bankomatu z systemem całego systemu, chociaż cieszę się, że źródło problemu jest jasne. – eudoxos

Powiązane problemy