2012-02-29 102 views
0

一週前我從gcc4.0升級到llvm gcc4.2。一切都很順利,除了有一件事我非常麻煩,因爲我更喜歡音頻信號處理。所以我真的希望有人能幫助我。我的問題是,在stl_vector.h中使用:: resize已經完全改變。std :: vector :: resize in gcc4.2

在gcc4.0

下面的代碼編譯的罰款:

std::vector< std::vector<myData> > mMy; 

std::for_each(mMy.begin(), mMy.end(), 
    std::bind2nd(std::mem_fun_ref(&std::vector<myData>::resize), numMy)); 

在gcc4.2它不與錯誤編譯:

沒有匹配函數調用mem_fun_ref ..

我我很確定,我不知道如何實現:: resize正確,有人可以告訴我我必須做什麼得到這個修復。我很高興,如果你能告訴我一個正確的代碼示例,但提示(書籍)和關鍵字,可以幫助我想出解決辦法也將不勝感激..

非常感謝您的幫助..

親切的問候, BZT

+0

可能是一個問題與包括。 'mem_fun_ref'應該在''我想。 – bames53 2012-02-29 17:39:21

回答

3

請確保您有

#include <functional> 
在包括

但是它會更容易爲你做到這一點(如果你想設置的myData的所有向量的大小。

std::vector<std::vector<myData > > mMy (size, std::vector(numMy)); 

這裏大小numMy的每個向量將

你也知道,GCC 4.2是真的還是很老,如果可以我會強烈建議GCC 4.6

用gcc 4.6,你可以做擺脫所有mem_func的任何東西與此:

std::for_each(mMy.begin(), mMy.end(), 
    std::bind(std::vector<myData>::resize, std::placeholders::_1, numMy)); 

(儘管如果需要的話,我仍然更喜歡構造函數選項)。

+0

+1使用正確的構造函數使bind2nd不必要。 – bames53 2012-02-29 17:56:56

+0

@ bames53任何使bind2nd不必要的東西。我曾經認爲這很好,直到像這樣的邊緣案例開始出現。我喜歡函數式編程,但它應該更困難。 – 111111 2012-02-29 18:01:37

+0

gcc4.6是沒有選擇,我只能有4.2.4不幸的是..什麼是你的第一個例子片段的大小?我認爲大小是numMy?並且我的代碼示例中使用men_fun_ref將調整mMy中的矢量myData的大小numMy,對不對? – bzt 2012-02-29 18:12:16

0

mem_fun_ref採用一個具有零個或一個參數的成員函數。

我想,如果你嘗試用「儲備」這需要一個說法,你的技術將代碼編譯

調整大小要兩個參數(但不調整):大小和初始化(其中有一個默認值)。我想這就是爲什麼沒有匹配的mem_fun_ref模板 - 它被可選的初始化器所迷惑。

也許你的gcc 4.0工作順利,但gcc 4.2不?

我在RH5 linux gcc 4.1.2(不匹配mem_fun_ref)和RH6 linux gcc 4.4.5(確實找到一個匹配)上測試過,所以也許你應該向前移植。

+0

'vector :: resize'確實有一個參數過載。我不確定C++是否應該自動選擇或者什麼。 – bames53 2012-02-29 18:07:57

+0

這是正確的,保留編譯,但不會在我的代碼中工作,因爲myData沒有被numMy的數量調整..我不完全理解你的帖子,是否意味着我不能使用上面的men_fun_ref調整大小gcc4.2了? – bzt 2012-02-29 18:16:57

+0

C++標準已調整大小(sz)並調整大小(sz,T&c),但gcc僅在gcc> 4.1時調整大小(sz,T&c = T())。所以我不明白如何使用mem_fun_ref來調整大小,對不起。 – 2012-02-29 20:58:27

0

111111有正確的答案,但我想解釋我認爲在這裏發生了什麼。

我相信代碼實際上並不合法,因爲std :: vector :: resize是一個重載函數。你必須投&std::vector<myData>::resize爲了選擇你想要的過載:

std::for_each(mMy.begin(), mMy.end(), 
    std::bind2nd(std::mem_fun_ref(
    reinterpret_cast<void (std::vector<myData>::*)(std::size_t)>(&std::vector<myData>::resize)), 
    numMy)); 
+0

調整大小在蘋果gcc 4.00中超載,但在redhat 4.1.2或蘋果gcc 4.2.1中沒有。 gcc 4.1.2中的mem_fun_ref對重載方法沒有問題 - 它調用1參數版本。 – 2012-02-29 19:58:56

+0

拋出我一個錯誤:// _GLIBCXX_RESOLVE_LIB_DEFECTS // 402不對新表達[some_]分配器::構造 空隙 構建體(指針__P,常量_TP&__val) {::新(__ P)_TP(__ VAL); } – bzt 2012-02-29 20:03:34

+0

@erik olson是的,這正是我的問題.. – bzt 2012-02-29 20:05:53