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

g++ 4.8.2: could not convert from function pointer to std::function<>

本文关键字:std function 转换 lt gt 函数 G++ 指针      更新时间:2023-10-16

我正试图编写一个类,该类将一个工厂函数作为构造函数参数,该函数在转换后的输入版本上创建同一类的另一个实例。对于一个平凡的例子,一个函子类接受一个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;
}

我做错了什么?

EDIT:link2012关于尝试PrInc2(int i, Factory fn = Factory(bar))的建议在上面的"repo"上运行良好,但在激励示例上失败了(GitHub链接;相关代码为erdos.h:35-54,围绕ParseStep和ParseFunction)。回到绘图板上进行更好的再现。。。。

您的代码的以下部分是唯一与您询问的编译器错误相关的部分,它使用-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的最新版本。