2013-03-25 3 views
5

Sto utilizzando Visual Studio 2012 (ma utilizzando gli strumenti di compilazione VC++ 2010) e ho queste due funzioni sovraccaricate (firme in basso) definite in una classe che successivamente chiamerò in un'altra di classe che crea un'istanza della prima classe (anche sotto):Visual C++ 2010 accetta la stringa per bool in funzione sovraccaricata

Defined in the class: 
Node CreateNode(Node *parent,string name,string node_text,bool expects_node = true); 
Node CreateNode(Node *parent,string name, string attribute, string value,bool expects_node = true) 

Calling these functions in the macro: 
Node axis1 = handler->CreateNode(&sparse,"axis","id","trigger_pt"); 

Quando faccio la chiamata di funzione, si chiama la prima funzione, non la seconda! Quindi tratta la seconda stringa come un booleano! Tuttavia, quando aggiungo "true" alla chiamata di funzione, chiama la seconda funzione come previsto. Qualcuno può spiegarlo? Grazie!

risposta

7

La stringa letterale "trigger_pt" è di tipo "matrice di 11 const char". Il compilatore ritiene che sia meglio convertirlo in un bool piuttosto che convertirlo in un std::string. Il motivo è dovuto al fatto che la conversione in bool utilizza solo conversioni standard (da matrice a puntatore e quindi puntatore a bool), mentre la conversione in std::string richiede la chiamata a un costruttore. Una sequenza di conversione standard è sempre considerata migliore di una sequenza di conversione definita dall'utente (che coinvolge il costruttore di conversioni).

When comparing the basic forms of implicit conversion sequences (as defined in 13.3.3.1)

  • a standard conversion sequence (13.3.3.1.1) is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence, and
  • [...]

È possibile forzarlo ad utilizzare il secondo overload rendendo quest'ultimo letterale std::string:

Node axis1 = handler->CreateNode(&sparse,"axis","id",std::string("trigger_pt")); 

L'altra alternativa è quella di fornire un altro overload che accetta un const char*, che viene preferito il bool versione. Questo sovraccarico può semplicemente inoltrarsi al sovraccarico di std::string.

+1

Oppure aggiungere un terzo sovraccarico che accetta un 'const char *', per renderlo automatico. – GManNickG

+1

A volte desidero parametri espliciti ... 'void f (esplic const bool b);'. Forse con C++ 2100? BTW: trova la sequenza di conversione completa [qui] (http://stackoverflow.com/a/15032114/2073257). –

+0

@GManNickG Grazie, l'ho aggiunto. –

Problemi correlati