2014-12-18 94 views
0

我試圖使用Boost的program_options庫來建立一個簡單的命令行應用程序到一個庫,但它失敗了一個非常奇怪的錯誤。 Here's 所有有問題的代碼(是的,it's很簡單):使用boost program_options失敗,出現奇怪的編譯錯誤

#include <iostream> 
#include <stdexcept> 
#include <string> 
#include <boost/program_options.hpp> 
#include "NCDocEngineInterop.h" 
#include "NCDocumentEngine.h" 
#include "NCConfigurationManager.h" 
#include "NCAcquisitions.h" 

namespace po = boost::program_options; 
using std::cout; 
using std::cerr; 
using std::endl; 
using std::domain_error; 
using std::wstring; 

void fail_if_empty(const po::variables_map& variables, const char* field) { 
    if (!(variables.count(field))) { 
     cerr << field << " is required, you must provide a value for it" << endl; 
     throw domain_error(field); 
    } 
} 

int main(int ac, char* av[]) 
{ 

    const char* nsdk_path_option = "nsdk-path"; // NC_CONFIGURATION::NC_NSDK_PATH 
    const char* ocr_path_option = "ocr-path"; // NC_CONFIGURATION::NC_OCR_PATH 
    const char* parser_path_option = "parser-path-option"; // NC_CONFIGURATION::NC_PARSER_PATH 
    const char* pdf_path = "pdf-path"; // NC_CONFIGURATION::NC_PDF_PATH 
    const char* output_directory = "output-directory"; 
    const char* input_file = "input-file"; 

    po::options_description description("Runs the NDSK engine at the provided files"); 
    description.add_options() 
     ("help", "produce help message") 
     (nsdk_path_option, po::value<wstring>(), "path to the NSDK") 
     (ocr_path_option, po::value<wstring>(), "path to the OCR") 
     (parser_path_option, po::value<wstring>(), "path to the parser") 
     (pdf_path, po::value<wstring>(),"path to the PDF processor") 
     (output_directory, po::value<wstring>(), "path to the folder where the output will be stored") 
     (input_file, po::value<wstring>(), "path to the input file") 
    ; 

    po::variables_map vm; 
    po::store(po::parse_command_line(ac, av, description), vm); 
    po::notify(vm); 

    fail_if_empty(vm, nsdk_path_option); 
    fail_if_empty(vm, ocr_path_option); 
    fail_if_empty(vm, parser_path_option); 
    fail_if_empty(vm, pdf_path); 
    fail_if_empty(vm, output_directory); 
    fail_if_empty(vm, input_file); 

    NCConfigurationManager::ncSetConfiguration(
     NC_NSDK_PATH, 
     vm[nsdk_path_option].as<wstring>()); 
    NCConfigurationManager::ncSetConfiguration(
     NC_OCR_PATH, 
     vm[ocr_path_option].as<wstring>()); 
    NCConfigurationManager::ncSetConfiguration(
     NC_PARSER_PATH, 
     vm[parser_path_option].as<wstring>()); 
    NCConfigurationManager::ncSetConfiguration(
     NC_PDF_PATH, 
     vm[pdf_path].as<wstring>()); 

    return 0; 
} 

這種情況發生的編譯錯誤是:

錯誤錯誤C2679:二進制 '< <':沒有找到操作符,其中 類型爲'const src'的右側操作數(或者沒有可接受的轉換)。 DocumentProcessor

錯誤錯誤C2228:'.fail'的左邊必須有class/struct/union c:\ work \ digitalbp \ projects \ releasedev \ nsdk_4_0 \ dev \ source \ src \ framework \ thirdparty \ boost \ boost \ lexical_cast.hpp 1281 1 DocumentProcessor

您可以看到lexical_cast.hpp file here

我不知道這裏發生了什麼,或者爲什麼這個錯誤發生在這段代碼中。我正在使用boost 1.50.0,現在我無法升級它。我也使用Visual Studio 2010來構建它。

而且here's輸出窗口的輸出:

1>c:\work\src\framework\thirdparty\boost\boost\lexical_cast.hpp(1281): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const src' (or there is no acceptable conversion) 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(679): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(726): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(968): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>,const InputStreamable>(std::basic_ostream<_Elem,_Traits> &&,_Ty)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t>, 
1>    InputStreamable=src, 
1>    _Ty=src 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(1085): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(186): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(192): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(199): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(206): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(226): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(260): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(280): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(305): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(325): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(345): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(366): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(386): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(407): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(427): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(447): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(467): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(487): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t> 
1>   ] 
1>   while trying to match the argument list '(std::basic_ostringstream<_Elem,_Traits,_Alloc>, const src)' 
1>   with 
1>   [ 
1>    _Elem=wchar_t, 
1>    _Traits=std::char_traits<wchar_t>, 
1>    _Alloc=std::allocator<wchar_t> 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\lexical_cast.hpp(1499) : see reference to function template instantiation 'bool boost::detail::lexical_stream_limited_src<CharT,Traits,RequiresStringbuffer>::shl_input_streamable<const InStreamable>(InputStreamable &)' being compiled 
1>   with 
1>   [ 
1>    CharT=char_type, 
1>    Traits=traits, 
1>    RequiresStringbuffer=true, 
1>    InStreamable=src, 
1>    InputStreamable=src 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\lexical_cast.hpp(1974) : see reference to function template instantiation 'bool boost::detail::lexical_stream_limited_src<CharT,Traits,RequiresStringbuffer>::operator <<<Source>(const InStreamable &)' being compiled 
1>   with 
1>   [ 
1>    CharT=char_type, 
1>    Traits=traits, 
1>    RequiresStringbuffer=true, 
1>    Source=src, 
1>    InStreamable=src 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\lexical_cast.hpp(1921) : while compiling class template member function 'std::wstring boost::detail::lexical_cast_do_cast<Target,Source>::lexical_cast_impl(const Source &)' 
1>   with 
1>   [ 
1>    Target=std::wstring, 
1>    Source=src 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\lexical_cast.hpp(2133) : see reference to class template instantiation 'boost::detail::lexical_cast_do_cast<Target,Source>' being compiled 
1>   with 
1>   [ 
1>    Target=std::wstring, 
1>    Source=src 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\program_options\detail\value_semantic.hpp(89) : see reference to function template instantiation 'Target boost::lexical_cast<T,std::basic_string<_Elem,_Traits,_Ax>>(const Source &)' being compiled 
1>   with 
1>   [ 
1>    Target=std::wstring, 
1>    T=std::wstring, 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char>, 
1>    _Ax=std::allocator<char>, 
1>    Source=std::basic_string<char,std::char_traits<char>,std::allocator<char>> 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\program_options\detail\value_semantic.hpp(170) : see reference to function template instantiation 'void boost::program_options::validate<T,char>(boost::any &,const std::vector<_Ty> &,T *,long)' being compiled 
1>   with 
1>   [ 
1>    T=std::wstring, 
1>    _Ty=std::string 
1>   ] 
1>   c:\work\src\framework\thirdparty\boost\boost\program_options\detail\value_semantic.hpp(163) : while compiling class template member function 'void boost::program_options::typed_value<T,charT>::xparse(boost::any &,const std::vector<_Ty> &) const' 
1>   with 
1>   [ 
1>    T=std::wstring, 
1>    charT=char, 
1>    _Ty=std::string 
1>   ] 
1>   c:\work\src\samples\cpp\documentprocessor\documentprocessor\main.cpp(37) : see reference to class template instantiation 'boost::program_options::typed_value<T,charT>' being compiled 
1>   with 
1>   [ 
1>    T=std::wstring, 
1>    charT=char 
1>   ] 
1>c:\work\src\framework\thirdparty\boost\boost\lexical_cast.hpp(1281): error C2228: left of '.fail' must have class/struct/union 
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ========== 
+0

是這樣如果沒有,請發佈所有編譯錯誤消息 – Mahesh

+0

在同一地方有另一個錯誤消息,現在包括在內 –

+0

查看輸出窗口併發布錯誤的完整模板實例化上下文 – Cameron

回答

2

的問題實際上是在這裏:

po::store(po::parse_command_line(ac, av, description), vm); 

parse_command_line instanciates一個basic_command_line_parser<charT>其中圖表當然char,不wchar_t的,因爲av類型爲char**。這意味着options_description中的所有字符串必然是basic_string<char>,即std::string而不是std::wstring

因爲命令行選項總是以普通的舊「c」字符串形式出現,所以如果您仔細考慮,這實際上是有意義的。即使它們是mbcs編碼,您也有責任使用正確的語言環境來執行轉換。不幸的是這是必要的,因爲MBCS的解釋是特定於語言環境的。

我當時一看,看它是否可以創建options_description的wchar_t的版本(如果你想從wmain()使用它,但它不是。options_description包含硬編碼std::string秒。

multi-byte strings reference

+0

太棒了!謝謝! –