2012-02-29 96 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