Compiler does not know, which overload of cb
to chose.
2) Even if it did know, it would not convert from void*
to, say void(*)(int)
, without any explicit conversion.
However, it can deduce it if you give compiler enough information:
void cb(int x) { std::cout <<"print inside integer callback : " << x << "\n" ; } void cb(float x) { std::cout <<"print inside float callback :" << x << "\n" ; } void cb(const std::string& x) { std::cout <<"print inside string callback : " << x << "\n" ; } int main() { void(*CallbackInt)(int); void(*CallbackFloat)(float); void(*CallbackString)(const std::string&); CallbackInt = cb; CallbackInt(5); CallbackFloat = cb; CallbackFloat(6.3); CallbackString = cb; CallbackString("John"); return 0; }