我正在使用Boost :: Asio进行网络通信。以下代码失败,出现以下编译错误。
代码:
std::wstring hostName(L"myserver");
std::wstring portName(L"myport");
auto query = boost::asio::ip::udp::resolver::query(boost::asio::ip::udp::v4(), hostName, portName);
编译错误:
Error 1 error C2665: 'boost::asio::ip::basic_resolver_query<InternetProtocol>::basic_resolver_query' :
none of the 5 overloads could convert all the argument types
我的问题:
目前在Windows上运行,使用Visual Studio 2013。
提前致谢。
答案 0 :(得分:2)
Boost :: Asio是否只需要ANSI-strings(std :: string)?它需要std :: string,但不一定是ANSI,因为std :: string可以存储UTF-8。
这是否意味着不支持具有非ANSI字符的主机名?我没有亲自尝试过,但由于这本质上是基础操作系统网络代码之上的包装器,我可以找不到使用UTF-8的任何理由。
或者我必须首先将我的宽字符串转换为UTF8吗?很可能是的,因为宽字符串格式仅由核心Windows API使用,而其他人使用UTF-8包括Boost。
在后一种情况下,Boost :: Asio是否提供了标准方法来执行此操作,还是可以使用自己的ANSI / Unicode转换例程? Boost似乎不支持wide-char。只要您使用Windows特定的字符编码,就可以使用Windows提供的COM接口进行转换(MultiByteToWideChar,WideCharToMultiByte),或使用您自己的例程。如果您知道自己的例程是可靠/正确的,并且您还没有使用COM,那么您可能希望坚持使用自己的例程,而不是在项目中添加对COM的依赖。