g ++ 4.8.2:无法从函数指针转换为std :: function<>

时间:2015-05-12 01:28:12

标签: c++ c++11

我试图编写一个类,它接受一个工厂函数作为构造函数参数,该函数在转换的输入版本上创建同一个类的另一个实例。对于一个简单的例子,一个函数类,它接受一个int,打印它,并返回另一个打印输入的后继的函子。

我收到表单错误

error: could not convert 'foo' from 'Type(*)(int)' to 'std::function<Type(int)>'

唯一似乎是工厂函数传递给构造函数。

使用函数指针而不是std::function<>可以正常工作,但我希望通过C ++ 11,我能够避免使用函数指针。

以下是一个例子:

#include <functional>
#include <iostream>

// std::function-returning-int param in ctor with default value
// This works fine

class PrInc; // "print and increment"

using Worker = std::function<int(int)>;

int foo(int i) {
    std::cout << i << std::endl;
    return i+1;
}

class PrInc {
  public:
    PrInc(int i, Worker fn = foo) : i_(i), fn_(fn) {}
    int operator()() { return fn_(i_); }
  private:
    int i_;
    Worker fn_;
};

// std::function-returning-PrInc2 param in ctor with default value
// This fails, at least on g++ 4.8.2 --std=c++11

class PrInc2;

using Factory = std::function<PrInc2(int)>;
// Use function ptrs (instead of std::function<>s) and it works fine
//typedef PrInc2 (*Factory)(int);

PrInc2 bar(int);

class PrInc2 {
  public:
    PrInc2(int i, Factory fn = bar) : i_(i), fn_(fn) {}
    PrInc2 operator()() { return fn_(i_); }
  private:
    int i_;
    Factory fn_;
};

PrInc2 bar(int i) {
    std::cout << i << std::endl;
    return PrInc2(i+1);
    // error: could not convert 'bar' from 'PrInc2 (*)(int) to 'Factory {aka std::function<PrInc2(int)>'
}

int main() {
    auto p1 = PrInc {1};
    auto p2 = PrInc{p1()};
    p2();

    auto p3 = PrInc2 {1};
    // error: could not convert 'bar' from 'PrInc2 (*)(int) to 'Factory {aka std::function<PrInc2(int)>'
    auto p4 = p3();
    p4();

    return 0;
}

我做错了什么?

编辑: thelink2012的尝试PrInc2(int i, Factory fn = Factory(bar))的建议在#34; repro&#34;上面,但在motivating example上失败(GitHub链接;相关代码是围绕ParseStep和ParseFunction的erdos.h:35-54)。回到绘图板以获得更好的重复....

1 个答案:

答案 0 :(得分:0)

代码的以下部分是与您要求的编译器错误相关的唯一部分,使用-std=c++11模式与gcc 4.9.2完全编译:

#include <functional>
#include <iostream>

using Worker = std::function<int(int)>;

int foo(int i) {
    std::cout << i << std::endl;
    return i+1;
}

class PrInc {
  public:
    PrInc(int i, Worker fn = foo) : i_(i), fn_(fn) {}
    int operator()() { return fn_(i_); }
  private:
    int i_;
    Worker fn_;
};

很可能是你正在使用的旧gcc中的一个错误。升级到更新版本的gcc。