2011-02-01 20 views
9

Boost: program_options ile komut satırı ayrıştırmada bir sorun yaşıyorum.Ayrıştırma LPTSTR * komut satırı, hatayla artar :: program_options

ayrıştırıcı ctor bir const std almak gerekiyordu
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); 

:: vector < grafik benim programda>

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

geçerli: anlatmaya hızlı yolu böylece kod göstermektir
typedef std::basic_string<TCHAR> tstring; 

alıyorum hatadır:

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 

Nerede ah, nereye gidiyorum? Her türlü döküm ve yeniden tanımlamayı denedim, ama hiçbir şey işe yaramadı ve ben de ipucumun sonunda.

Düzenleme @Zac: Sadece Visual Studio 2008 VC9 derleyici

kullanıyorum olduğunu işaret etmek

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 

Düzenleme : Eğer önerilen değişiklikleri yapma
... hatası alıyorum

cevap

5

Bir unicode yapı kullanıyor görünüyor, bu yüzden açıkça geniş karakter sürümünü kullanın ya:

po::wcommand_line_parser parser(args); 

veya daha esnek:

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

Bu da Georg. Bir tcommand_line_parser yazdım. Teşekkürler adamım. – Dennis

2

birlikte sapıtmışsam hat aşağıdaki gibidir:

const std::vector<tstring> args; 

Değişim bunun için:

std::vector<tstring> args; 
+2

@ Dennis: Ayrıştırıcı ctor, const tarafından bir vektör alsa bile, bu ona geçirdiğiniz vektörün const olması gerektiği anlamına gelmez. Bu, oyuncunun vektörü değiştirmeyeceği anlamına gelir. Bu nedenle, bu cevap gereksiz const'lerinizi kaldırır, bu da daha sonra push_back aracılığıyla vektörü değiştirmeye çalıştığınızda bir hatadır. –

+0

Fred ... spot on. Zac ... işe yaramaz. Bu programımın ilk iterasyonu oldu. Söz konusu yayındaki düzenlemeye bakın. – Dennis

+0

@Dennis: UNICODE oluşturma seçeneğinin proje ayarlarınızda kapalı olduğundan emin olun. –

İlgili konular