2010-07-09 46 views
1

考慮下面的成員函數重載採取各種仿函數的boost ::功能和普通的函數指針:ambigous超載

class Foo { 
public: 
    void bar(boost::function<void(int)> func); 
    void bar(boost::function<void(float)> func); 
    void bar(boost::function<void(const std::vector<float>&)> func); 
} 

和功能

void baz(float f) { std::cout << "float :" << f << std::endl; } 

那麼爲什麼不考慮平原函數指針巴茲

Foo foo; 
foo.bar(&baz); 

產生此錯誤:

error: call of overloaded ‘bar(void (*)(float))’ is ambiguous 
note: candidates are: void Foo::bar(boost::function<void(int)>) 
note: void Foo::bar(boost::function<void(float)>) 
note: void Foo::bar(boost::function<void(const std::vector<float, std::allocator<float> >&)>) 

如何解決此歧義?

回答

0

不漂亮,也不安全:

foo.bar(static_cast<function<void(float)> >(&baz)); 
0

另一種方法:使用Initializers

foo.bar(function<void(float)>{ &baz });