2013-03-26 11 views
7

Perché la seguente stampa è "A boolean!"? Mi rendo conto che ci sono alcune strane conversioni in corso, dal momento che se costruisco in modo esplicito uno std :: string ottengo il comportamento corretto. Ma perché la risoluzione del sovraccarico sceglie visitor::operator()(bool) nel seguente caso?boost :: variante visitatore sceglie il sovraccarico errato

#include <boost/variant.hpp> 
#include <string> 

typedef boost::variant<bool, std::string> type; 

struct visitor : public boost::static_visitor<> { 
    void operator()(bool b) const { 
     std::cout << "A boolean!" << std::endl; 
    } 

    void operator()(const std::string& str) const { 
     std::cout << "A string!" << std::endl; 
    } 
}; 

int main(int argc, char* argv[]) { 
    type t = "I am a string"; 
    t.apply_visitor(visitor()); 

    return 0; 
} 

Sono in esecuzione di Visual Studio 2012 (CTP o no dà lo stesso risultato)

+0

FTR il membro 'apply_visitor' non fa parte dell'interfaccia pubblica. Dovresti usare la versione indipendente: 'apply_visitor (visitor(), t)'. –

+0

Grazie a @LucDanton. Mi è mancato quando ho letto la documentazione –

risposta

7

Stai initialisng t con un (tipo che decade a) const char*. La conversione di un puntatore in bool è una conversione standard, mentre la conversione const char* in std::string è una conversione definita dall'utente. La conversione standard ha la precedenza.

Problemi correlati