2012-04-11 21 views
8

Tengo una función sobrecargada que quiero pasar junto con una función std ::. GCC4.6 no encuentra una "función de coincidencia". Si bien encontré algunas preguntas aquí, las respuestas no son tan claras como me gustaría. ¿Podría alguien decirme por qué el siguiente código no puede deducir la sobrecarga correcta y cómo (elegantemente) trabajar a su alrededor?Wrap función sobrecargada a través de std :: función

int test(const std::string&) { 
    return 0; 
} 

int test(const std::string*) { 
    return 0; 
} 

int main() { 
    std::function<int(const std::string&)> func = test; 
    return func(); 
} 

Respuesta

17

Ambigua situación.

Para eliminar la ambigüedad, utilice conversión explícita como:

typedef int (*funtype)(const std::string&); 

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast! 

Ahora el compilador sería capaz de eliminar la ambigüedad de la situación, en función del tipo en el reparto.

O bien, puede hacer esto:

typedef int (*funtype)(const std::string&); 

funtype fun = test; //no cast required now! 
std::function<int(const std::string&)> func = fun; //no cast! 

Entonces, ¿por std::function<int(const std::string&)> no funciona de la manera funtype fun = test funciona de arriba?

Bueno, la respuesta es, porque std::function se puede inicializar con cualquier objeto, ya que su constructor está provisto de plantillas, que es independiente del argumento de la plantilla que pasó al std::function.

+1

Utilice 'static_cast' en lugar del estilo antiguo. – Anonymous

+0

@Anonymous: Sí. Pero quería hacerlo corto. De todos modos, lo edité para que se vea como C++ - ish! – Nawaz

+0

Qué irónico: tiene que usar punteros a funciones para obtener una función std ::, que se introdujo para alejarse de los punteros a las funciones :) thx – abergmeier

Cuestiones relacionadas