我得到了
在这种情况下,“错误C3861:'to8Bit':找不到标识符”
typedef struct _ustruct2
{
int which;
union
{
double d;
tstring * s;
bool b;
char e;
} uu;
} ustruct2;
std::string to8Bit(const std::string &s);
std::string to8Bit(const std::string s);
std::string to8Bit(const tstring s);
std::string to8Bit(tstring s);
std::string to8Bit(tstring &s);
std::string to8Bit(wchar_t * pc);
std::string to8Bit(const tstring &s);
std::string to8Bit(const char * pc, int len = -1);
std::string to8Bit(const wchar_t * pc, int len = -1);
static void outputustruct(FILE * opmte, int i, const char * s, const ustruct2 &u)
{
std::string mys2 = to8Bit((*u.uu.s).c_str());
}
本文认为我不需要其他to8BIT
的其他版本。但是我本以为其中之一会匹配。我试过在函数outputustruct函数头中删除const和/或与号,并在删除与号时在对to8Bit
的调用中删除星号。我已经尝试在结构定义和带有错误的代码中使用string和tstring,但是我没有做任何事情来编译它。
此代码在VS 2005中工作正常,但在VS 2017中工作不正常。以我的经验,MS严格限制了以后版本中的编译器以更严格地符合标准,但是我看不到是什么原因导致了编译器错误。
答案 0 :(得分:0)
C ++ 11 std::wstring_convert
(在C ++ 17中已弃用)提供了一种简单的解决方案:
在您的情况下,tstring定义为:
#include <tchar.h> // For _TCHAR
typedef std::basic_string<_TCHAR> tstring;
可以这样转换:
#include <locale>
#include <codecvt>
int main()
{
tstring string_to_convert = L"Follow the white rabbit";
// Converter setup:
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;
// Convert (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes(string_to_convert);
return 0;
}
或者您的情况,例如:
#include <locale>
#include <codecvt>
static void outputustruct(FILE * opmte, int i, const char * s, const ustruct2 &u)
{
// Converter setup:
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;
// Convert:
string mys2 = converter.to_bytes(*u.uu.s);
}
(在VS2017 C ++上有效)