std :: vector ::在gcc4.2中调整大小

时间:2012-02-29 17:32:19

标签: c++ gcc resize stdvector

一周前我从gcc4.0升级到llvm gcc4.2。一切顺利,除了一件事我真的很难找到因为我更多的是音频信号处理类型的家伙。所以我真的希望有人帮助我。我的问题是在stl_vector.h中使用:: resize已完全改变。

在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

3 个答案:

答案 0 :(得分: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));

(虽然如果您的用例需要,我仍然会更喜欢构造函数选项。)

答案 1 :(得分:0)

mem_fun_ref采用零或一个参数的成员函数。

我怀疑你的代码会编译,如果你用'reserve'尝试这种技术,它接受一个参数(但不调整大小。)

resize需要两个参数:size和initializer(具有默认值)。我想这就是为什么没有匹配的mem_fun_ref模板 - 它被可选的初始化程序搞糊涂了。

也许你的gcc 4.0顺利地解决了这个问题,但是gcc 4.2没有?

我测试了RH5 linux gcc 4.1.2(不匹配mem_fun_ref)和RH6 linux gcc 4.4.5(找到匹配)所以也许你应该向前迁移。

答案 2 :(得分: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));