【问题标题】:storing mem_fun in a standard container将 mem_fun 存储在标准容器中
【发布时间】:2010-09-03 17:07:45
【问题描述】:

有没有办法创建vector< mem_fun_t< ReturnType, MyClass > >

我看到的错误是:

error C2512: 'std::mem_fun1_t<_Result,_Ty,_Arg>' : no appropriate default constructor available

【问题讨论】:

  • 我错了。但默认 ctor 看起来可能是问题的根源。删除我的答案很糟糕,因为它也会带走很多建设性的 cmets :-(

标签: c++ stl vector containers mem-fun


【解决方案1】:

我真的不明白为什么它不起作用,但它实际上是一个非常丑陋的解决方案。只需使用 vector&lt;function&lt;ReturnType(MyClass*)&gt;&gt;,就不会出现 C++03 活页夹中存在的这些问题。

【讨论】:

  • +1 -- 始终支持降低复杂性的设计。如果需要,以后可以随时与mem_fun 绑定。
【解决方案2】:

你当然可以创建这样的向量。

#include <vector>
#include <functional>
#include <iostream>

struct MyClass
{
    int a()  { return 1; }
    int b()  { return 2; }
};

int main()
{
    std::vector<std::mem_fun_t<int, MyClass> > vec;
    vec.push_back(std::mem_fun(&MyClass::a));
    vec.push_back(std::mem_fun(&MyClass::b));
    MyClass x;
    for (size_t i = 0; i != vec.size(); ++i) {
        std::cout << vec[i](&x) << '\n';
    }
}

如果您遇到问题,请仔细阅读错误消息。例如,std::mem_fun 可以返回各种包装器,具体取决于您传递给它的内容。

或者确实,切换到 boost 或 C++0x 的 function


编辑:有了这个特定的错误消息,我假设您正在执行一些调用包含类型的默认构造函数的操作(例如 resize 或使用向量的构造函数指定大小)。你不能使用这些功能。

【讨论】:

    【解决方案3】:

    mem_fun_t满足存储在容器中的要求(可复制构造和可赋值),所以答案是肯定的。

    但是,它不是默认可构造或可比较的,所以有些事情你不能用它们的容器来做,包括:

    • 调整大小,除非您提供要填充的值
    • 使用非零大小构造,除非您提供要填充的值
    • 比较容器

    您看到的错误来自尝试调整大小或使用大小构造。

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2014-11-08
      • 2021-12-09
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多