【问题标题】:TCLAP issus with parsing std::wstring解析 std::wstring 的 TCLAP 问题
【发布时间】:2011-08-24 05:24:49
【问题描述】:

TCLAP std::wstring 问题。 大家好,

我正在使用 TCLAP(命令行解析实用程序)。到目前为止,它运行良好,直到我遇到 wstring 处理能力的问题。

我有下面一行来解析 UnlabeledValueArg 的代码

std::wstring defaultValue; 

UnlabeledValueArg<std::wstring>
serverName("COMPUTERNAME", "List all scheduled tasks of computer", false,
           defaultValue, "string" );

我遇到了编译时问题(Visual Studio 吐出了大量令人难以置信的问题。)。我的问题是有没有人尝试过将 std::wstring 与 TCLAP 一起使用。如果是,您可以发布解决方案或解决方法。谢谢。

编辑 - 我得到的编译器警告是 -

C:\DevProjects\MyProjects\nttoolkit\trunk\external\tclap/StandardTraits.h(187) : 错误 C2679: 二进制 '=' : 否 运算符找到了 'const 类型的右手操作数 std::string' (或者没有 可接受的转换)

    c:\Program Files (x86)\Microsoft Visual Studio

9.0\VC\include\xstring(914): 可能是 'std::basic_string<_elem>

&std::basic_string<_elem>::operator

=(const std::basic_string<_elem> &)' 和 [ _Elem=wchar_t, _Traits=std::char_traits, _Ax=std::分配器 ]

    c:\Program Files (x86)\Microsoft Visual Studio

9.0\VC\include\xstring(919): 或 'std::basic_string<_elem> &std::basic_string<_elem>::operator =(const _Elem *)' 和 [ _Elem=wchar_t, _Traits=std::char_traits, _Ax=std::分配器 ]

    c:\Program Files (x86)\Microsoft Visual Studio

9.0\VC\include\xstring(924): 或 'std::basic_string<_elem> &std::basic_string<_elem>::operator =(_Elem)' 和 [ _Elem=wchar_t, _Traits=std::char_traits, _Ax=std::分配器 ] 在尝试匹配参数列表时 '(std::wstring, const std::string)'

    C:\DevProjects\MyProjects\nttoolkit\trunk\external\tclap/Arg.h(446)

: 见函数模板参考 实例化'无效 TCLAP::SetString(T &,const std::string &)' 正在编译 和 [ T=std::wstring ]

    C:\DevProjects\MyProjects\nttoolkit\trunk\external\tclap/ValueArg.h(391)

: 见函数模板参考 实例化'无效 TCLAP::ExtractValue(T &,const std::string &,TCLAP::StringLike)' 正在编译 和 [ T=std::wstring ]

    C:\DevProjects\MyProjects\nttoolkit\trunk\external\tclap/ValueArg.h(389)

: 编译类模板时 成员函数'无效 TCLAP::ValueArg::_extractValue(const 标准::字符串 &)' 和 [ T=std::wstring ]

    C:\DevProjects\MyProjects\nttoolkit\trunk\external\tclap/ValueArg.h(325)

: 编译类模板时 成员函数'bool TCLAP::ValueArg::processArg(int *,std::vector<_ty> &)' 和 [ T=std::wstring, _Ty=std::字符串 ]

    C:\DevProjects\MyProjects\nttoolkit\trunk\external\tclap/UnlabeledValueArg.h(44)

:参见类模板的参考

实例化'TCLAP::ValueArg' 正在编译 和 [ T=std::wstring ]

    C:\DevProjects\MyProjects\nttoolkit\trunk\tasksecure\src\main.cpp(26)

:参见类模板的参考 实例化 'TCLAP::UnlabeledValueArg' 是 编译 和 [ T=std::wstring ]

TaskSecure - 1 个错误,6 个警告

【问题讨论】:

  • VS 给你的错误是什么?
  • 我刚刚编辑并添加了编译器警告。谢谢。

标签: c++


【解决方案1】:

我下载了源代码并构建了您的示例。 UnlabeledValueArg 确实需要 std::string,所以很抱歉。 StandardTraits.h:202 显示 dst = src。它试图将 std::string 设置为 std::wstring 并且没有转换。显然,TCLAP 不支持 std::wstring。 src 应该是 std::wstring。

一种解决方法可能是改用 std::string,并在使用 TCLAP 之前对程序的参数进行 UTF-8 编码。

另一种选择是要求 TCLAP 的所有者扩展它以支持宽参数和窄参数。

【讨论】:

  • 如有疑问,请将其添加为评论。还可以尝试在发布回复之前查看方法签名。
  • @Eternal Learner - 方法签名指示:未找到采用“const std::string”类型的右侧操作数的运算符。在我看来,您应该使用宽字符串。
  • 也许看看这个可能会给你一个更好的主意。 -tclap.sourceforge.net/html/annotated.html。看看 UnlabeledValueArg 类的构造函数。
  • @Eternal Learner - 我下载了源代码并构建了您的示例。 UnlabeledValueArg 确实需要 std::string,所以很抱歉。 StandardTraits.h:202 显示 dst = src。它试图将 std::string 设置为 std::wstring 并且没有转换。显然,TCLAP 不支持 std::wstring。 src 应该是 std::wstring。一种解决方法可能是改用 std::string,并在使用 TCLAP 之前对程序的参数进行 UTF-8 编码。
  • 感谢您的建议。是的,我现在正在研究并尝试添加对 std::wstring 的支持。我不太了解 UTF-8 编码。谢谢会调查它。请编辑您的答案,以便我可以删除我的反对票(感谢您抽出时间并承受下载源代码的痛苦)。
猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2016-06-04
  • 2021-11-10
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多