Я написал строковый класс с именем UString
и хочу, чтобы он мог конвертировать std::string
в std::wstring
, а также конвертировать std::wstring
в std::string
.
Я использую библиотеку вC ++ 17, поэтому я написал код следующим образом.
В UString.h:
public:
UString(std::string s);
UString(std::wstring ws);
private:
std::string str;
std::string WTS(const std::wstring & wstr);
std::wstring STW(const std::string & str);
public:
std::wstring w_str();
const wchar_t* wc_str();
В UString.cpp:
UString::UString(std::string s)
{
str = s;
}
UString::UString(std::wstring ws)
{
str = WTS(ws);
}
std::string UString::WTS(const std::wstring & wstr)
{
std::string ret;
try {
std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
ret = wcv.to_bytes(wstr);
}
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return ret;
}
std::wstring UString::STW(const std::string & str)
{
std::wstring ret;
try {
std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
ret = wcv.from_bytes(str);
}
catch (const std::exception & e) {
std::cerr << e.what() << std::endl;
}
return ret;
}
std::wstring UString::w_str()
{
return STW(str);
}
const wchar_t* UString::wc_str()
{
return STW(str).c_str();
}
И это должно работатьвот так:
UString ustr="test"; //the value should be "test"
UString ustr2=L"test2"; //the value should be "test2"
wcout<<ustr.w_str()<<endl; //the value should be "test"
cout<<ustr.wc_str()<<endl; //the value should be "test"
В Linux, GCC 8.0.1, класс работает нормально, но в Windows Visual Studio 2017, когда я использую UString::w_str()
или UString::wc_str()
, он не может работать ивыбросить ошибку "плохое преобразование". Что я должен сделать, чтобы сделать эту работу?