Компилятор 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
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

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