Компилятор VS 2017 C++ не может найти подходящую функцию в VS 2005

я осознаю

"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 ужесточает компилятор в более поздних версиях, чтобы более строго соответствовать стандартам, но я не вижу, что вызывает здесь ошибку компилятора.

Невозможно перегрузить по ссылке value vs const.

SergeyA 10.08.2018 16:59

У меня есть пара прототипов to8Bit без const. Если я удалю константу из третьего аргумента функции outputustruct, я все равно получу ту же ошибку.

RichT 10.08.2018 17:17

@SergeyA Это не так, но удачи в вызове любой из перегрузок;)

Lightness Races in Orbit 10.08.2018 17:58

OP, вы не можете получить ошибку тот из этого кода. Я ожидал неоднозначного звонка, но не этого. Представьте свой минимальный воспроизводимый пример.

Lightness Races in Orbit 10.08.2018 17:59

Почему вы используете typedef struct _tagname? Это C и совершенно не нужно в C++. В C++ вы просто определяете struct ustruct2 {...}

Adrian W 10.08.2018 18:41

Вы фокусируетесь на правильной ошибке? Это простой «идентификатор не найден», он не беспокоится о том, что не нашел совпадения или неоднозначной перегрузки. Вы могли скрыть реальную проблему, сделав вид, что весь этот код находится в одном исходном файле.

Hans Passant 10.08.2018 18:52

@LightnessRacesinOrbit, ладно, я думаю, вы выигрываете по техническим характеристикам. ;)

SergeyA 10.08.2018 19:12

У вас здесь опечатка to8Bit(*u.uu.s).c_str()) 2 открытых фигурных скобки и 3 закрывающие фигурные скобки.

Tony J 10.08.2018 19:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
359
1

Ответы 1

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': необъявленный идентификатор» Что-то не хватает?

RichT 10.08.2018 17:52

Я оставил определение ustruct2 таким, каким оно было изначально, на всякий случай. Я получаю сообщение «ошибка C2039: 'codecvt_utf8': не является членом 'std'» и «ошибка C2039: 'wstring_convert': не является членом 'std'» Когда вы говорите, что wstring_convert устарел в 2017 году, вы имеете в виду VS2017? Если это так, то не проблема, поскольку я перехожу на VS2017?

RichT 10.08.2018 20:12

@RichT #include <locale> и #include <codecvt>

Amit G. 10.08.2018 20:28

Не повезло: ошибка 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 10.08.2018 20:59

@RichT tstring не является стандартным типом C++. Я предполагал, что в вашем коде есть что-то вроде: #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif. Какое у вас определение tstring?

Amit G. 10.08.2018 21:49

Мне очень жаль, что я думал, что это часть C++, потому что, когда я смотрел онлайн, tstring была указана на других сайтах. Я также был перепутан с директивой компилятора «Относиться к Wchar_t как к встроенному типу», которая увидела «t» и пришла к глупому выводу (я, кстати, установил для нее значение «Нет»). В моем коде мне нравится следующая строка: typedef std :: basic_string <_TCHAR> tstring; и похоже, что TCHAR является частью языка или расширений.

RichT 10.08.2018 23:00

Интересно, но, похоже, не ответил на этот вопрос

Lightness Races in Orbit 12.08.2018 15:30

@LightnessRacesinOrbit Иногда кто-то спрашивает: «Как добраться на такси из Нью-Йорка в Лос-Анджелес?». И лучший ответ: «Вы летите». Это не ответ на вопрос, но ответ на проблему.

Amit G. 12.08.2018 16:15

@AmitG. Тогда предложение перефразировать / улучшить вопрос уместно, но это вопрос-ответ! Вы отвечаете на заданный вопрос :)

Lightness Races in Orbit 13.08.2018 11:26

@LightnessRacesinOrbit Я предложил перефразировать вопрос так: «Как преобразовать std :: basic_string <_TCHAR> в std :: string в VS2017 C++?» но мое предложение отклонили.

Amit G. 13.08.2018 11:35

@AmitG .: Верно, потому что это совсем другой вопрос :)

Lightness Races in Orbit 13.08.2018 11:55

@LightnessRacesinOrbit Проблема XY

Amit G. 13.08.2018 22:50

@AmitG. Да, слышал об этом. Это чрезмерно вызвано. Просто ссылка на эту статью не означает, что вы можете писать случайные ответы на совершенно несвязанные вопросы: P

Lightness Races in Orbit 14.08.2018 13:01

Другие вопросы по теме