我试图编写一个类,它接受一个工厂函数作为构造函数参数,该函数在转换的输入版本上创建同一个类的另一个实例。对于一个简单的例子,一个函数类,它接受一个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)。回到绘图板以获得更好的重复....
答案 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。