2011-02-01 21 views
9

Sto riscontrando un problema con l'analisi della riga di comando con boost: program_options. Il modo più rapido per spiegarlo è quello di mostrare il codice in modo:Analisi LPTSTR * argomenti della riga di comando con boost :: program_options

const std::vector<tstring> args; 
if (ac > 0 && NULL!=av) //ac is a ULONG 
{ 
    for (int i = 0; i < ac; i++) 
    { 
     args.push_back(av[i]); //av is an LPTSTR pointer (pointer to TCHAR*) 
    } 

    } 
    po::command_line_parser parser(args); 

Il ctor parser dovrebbe prendere uno std :: vector const < Grafico>

typedef basic_command_line_parser<char> command_line_parser; 
typedef basic_command_line_parser<wchar_t> wcommand_line_parser; 

/** Creates instance of 'command_line_parser', passes parameters to it, 
    and returns the result of calling the 'run' method.   
*/ 
template<class charT> 
    class basic_command_line_parser : private detail::cmdline { 
    public: 
     /** Creates a command line parser for the specified arguments 
      list. The 'args' parameter should not include program name. 
     */ 
     basic_command_line_parser(const std::vector< 
            std::basic_string<charT> >& args); 

tstring nel mio programma è

typedef std::basic_string<TCHAR> tstring; 

L'errore che ottengo è:

Error 16 error C2664: 'boost::program_options::basic_command_line_parser<charT>::basic_command_line_parser(const std::vector<_Ty> &)' : cannot convert parameter 1 from 'const std::vector<_Ty>' to 'const std::vector<_Ty> &' myfile.cpp 329 

Dove, oh dove, sto andando fuori strada? Ho provato tutti i tipi di casting e ridefinizione, ma niente ha funzionato e sono alla fine del mio attacco.

Edit @Zac:
Rendere le modifiche suggerite ... ottengo l'errore:

Error 14 error C2664: boost::program_options::basic_command_line_parser<charT>::basic_command_line_parser(const std::vector<_Ty> &)' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const std::vector<_Ty> &' MyFile.cpp 328 

Modifica Giusto per sottolineare che sto usando Visual Studio 2008 VC9 compilatore

risposta

5

Sembra che tu stia usando una build unicode, quindi o utilizzare in modo esplicito la versione larga char:

po::wcommand_line_parser parser(args); 

o la più flessibile:

po::basic_command_line_parser<TCHAR> parser(args); 
+0

Ecco Georg. Sto digitando typcom un tcommand_line_parser. Grazie amico. – Dennis

2

La linea è andato fuori strada con è qui sotto:

const std::vector<tstring> args; 

modificarla in:

std::vector<tstring> args; 
+2

@ Dennis: Anche se il parser ctor prende un vettore di const e, ciò non significa che il vettore che si passa in esso deve essere const. Significa che Ctor non cambierà il vettore. Ecco perché questa risposta rimuove il tuo const non necessario, che è un errore quando successivamente provi a modificare il vettore tramite push_back. –

+0

Fred ... spot on. Zac ... non funziona. Questa è stata la prima ripetizione del mio programma. Vedi la modifica nel post di domanda. – Dennis

+0

@Dennis: verifica che l'opzione di compilazione UNICODE sia disattivata nelle impostazioni del progetto. –

Problemi correlati