я осознаю
"error C3861: 'to8Bit': identifier not found" in this situation:
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 и удалить звездочку в вызове to8Bit
при удалении амперсанда. Я пробовал строки и tstring в определении структуры и коде с ошибкой, но ничего из того, что я делаю, не заставляет его скомпилировать.
Этот код отлично работает в VS 2005, но не в VS 2017. По моему опыту, MS ужесточает компилятор в более поздних версиях, чтобы более строго соответствовать стандартам, но я не вижу, что вызывает здесь ошибку компилятора.
У меня есть пара прототипов to8Bit без const. Если я удалю константу из третьего аргумента функции outputustruct, я все равно получу ту же ошибку.
@SergeyA Это не так, но удачи в вызове любой из перегрузок;)
OP, вы не можете получить ошибку тот из этого кода. Я ожидал неоднозначного звонка, но не этого. Представьте свой минимальный воспроизводимый пример.
Почему вы используете typedef struct _tagname
? Это C и совершенно не нужно в C++. В C++ вы просто определяете struct ustruct2 {...}
Вы фокусируетесь на правильной ошибке? Это простой «идентификатор не найден», он не беспокоится о том, что не нашел совпадения или неоднозначной перегрузки. Вы могли скрыть реальную проблему, сделав вид, что весь этот код находится в одном исходном файле.
@LightnessRacesinOrbit, ладно, я думаю, вы выигрываете по техническим характеристикам. ;)
У вас здесь опечатка to8Bit(*u.uu.s).c_str())
2 открытых фигурных скобки и 3 закрывающие фигурные скобки.
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++)
Заранее прошу прощения за то, что я запутался, когда дело доходит до строк и символов. Это изменение, которое вы внесли в ustruct2, где у вас есть "std :: tstring * ts;" вместо "tstring * s;" на что-нибудь влияет? Я не хочу ничего нарушать в большом проекте. Тем не менее, я получаю сообщение об ошибке «ошибка C2039: 'tstring': не является членом 'std'» в определении структуры и «ошибка C2065: 'USES_CONVERSION': необъявленный идентификатор» Что-то не хватает?
Я оставил определение ustruct2 таким, каким оно было изначально, на всякий случай. Я получаю сообщение «ошибка C2039: 'codecvt_utf8': не является членом 'std'» и «ошибка C2039: 'wstring_convert': не является членом 'std'» Когда вы говорите, что wstring_convert устарел в 2017 году, вы имеете в виду VS2017? Если это так, то не проблема, поскольку я перехожу на VS2017?
@RichT #include <locale> и #include <codecvt>
Не повезло: ошибка C2664: 'std :: basic_string <char, std :: char_traits <char>, std :: allocato r <char>> std :: wstring_convert <convert_type, wchar_t, std :: allocator <wch ar_t> , std :: allocator <char>> :: to_bytes (co nst _Elem *, const _Elem *) ': невозможно преобразовать аргумент 1 из' tstring 'в' wchar_t '
@RichT tstring не является стандартным типом C++. Я предполагал, что в вашем коде есть что-то вроде: #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif. Какое у вас определение tstring?
Мне очень жаль, что я думал, что это часть C++, потому что, когда я смотрел онлайн, tstring была указана на других сайтах. Я также был перепутан с директивой компилятора «Относиться к Wchar_t как к встроенному типу», которая увидела «t» и пришла к глупому выводу (я, кстати, установил для нее значение «Нет»). В моем коде мне нравится следующая строка: typedef std :: basic_string <_TCHAR> tstring; и похоже, что TCHAR является частью языка или расширений.
Интересно, но, похоже, не ответил на этот вопрос
@LightnessRacesinOrbit Иногда кто-то спрашивает: «Как добраться на такси из Нью-Йорка в Лос-Анджелес?». И лучший ответ: «Вы летите». Это не ответ на вопрос, но ответ на проблему.
@AmitG. Тогда предложение перефразировать / улучшить вопрос уместно, но это вопрос-ответ! Вы отвечаете на заданный вопрос :)
@LightnessRacesinOrbit Я предложил перефразировать вопрос так: «Как преобразовать std :: basic_string <_TCHAR> в std :: string в VS2017 C++?» но мое предложение отклонили.
@AmitG .: Верно, потому что это совсем другой вопрос :)
@LightnessRacesinOrbit Проблема XY
@AmitG. Да, слышал об этом. Это чрезмерно вызвано. Просто ссылка на эту статью не означает, что вы можете писать случайные ответы на совершенно несвязанные вопросы: P
Невозможно перегрузить по ссылке value vs const.