met*_*tal 7 c++ overloading implicit-conversion c++11
可能重复:
为什么我的C++编译器不能推导出boost函数的模板参数?
std :: function的模板参数(签名)是不是它的类型?
我有以下内容:
#include <functional>
void Foo( std::function<void()> );
void Foo( std::function<void(int)> );
void Bar();
int main()
{
Foo( Bar ); // Error: ambiguous
Foo( [](){} ); // Error: ambiguous
Foo( std::function<void()>( Bar ) ); // Ok
Foo( std::function<void()>( [](){} ) ); // Ok
}
Run Code Online (Sandbox Code Playgroud)
我可以在main()中使用前两行而不使用最后两行中的函数样式转换吗?也许使用std :: enable_if解决方案?
任何调用美孚与一个参数,它是不完全的一个std::function<void()>
,并std::function<void(int)>
会导致一个悬而未决的过载。甚至像Foo(1)
or 之类的愚蠢的东西Foo("abc")
。这是因为 的构造函数std::function
被模板化并接受任何类型。std::function<void()>(1)
会在实例化时失败,但重载解析发生在实例化之前。
所以不,您需要以一种或另一种方式提供与其中一个功能的完全匹配。您可以引入其他重载的 Foo 实例,例如
void Foo(void (*)());
void Foo(void (*)(int));
Run Code Online (Sandbox Code Playgroud)
这将导致更好的匹配,歧义将不再存在。
归档时间: |
|
查看次数: |
3538 次 |
最近记录: |