2011-08-01 39 views
5

我收到編譯錯誤使用g ++ 4.6,並使用boost::make_shared<T>(...)時提高1.42,而shared_ptr<T>(new T(...))剛剛編譯精細。不幸的是,我無法隔離一個最小的例子(我嘗試過的任何編譯都很好),但也許有人可以向我解釋其中的差異。的boost :: make_shared <T>(...)無法編譯,shared_ptr的<T>(新T(...))不

我instatiating的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中?我看不到我的錯?

+1

這看起來像Boost等效的'std :: forward'和你的編譯器之間的奇怪的相互作用。你使用的是什麼編譯器版本,以及你使用的是什麼版本的Boost? –

+0

它是在問題g ++ 4.6和boost 1.42中指定的。 – eudoxos

回答

4

boost::make_shared使用給定參數分配給定類型的對象並將其包裝在boost::shared_ptr中。因此,它必須將您給它的參數轉發給構造函數。爲了讓你的調用起作用,它必須能夠找到一個與你給它的參數列表相匹配的構造函數。

你的問題似乎是它有難以轉發你的整數參數。我不確定如何,因爲你所有的論點都是基本類型。

Boost 1.42於18個月前發佈; GCC 4.6最近發佈的時間比那更晚。我猜如果你更新到更新版本的Boost,你就不會有這個問題。

+0

'boost :: make_shared'在其他情況下工作得很好,這就是爲什麼我不明白這裏會發生什麼...... – eudoxos

+1

@euxodos - 在這18個月中,轉發和右值引用的規則已經發生了變化。似乎編譯器和庫是針對不同的規則集編碼的。 –

+0

我無法更新助推系統的ATM,但我很高興問題的根源是明確的。 – eudoxos

相關問題