Странные ошибки при обновлении кода с C++17 до C++20 с использованием MSVC 2022C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Странные ошибки при обновлении кода с C++17 до C++20 с использованием MSVC 2022

Сообщение Anonymous »

Я пытаюсь обновить нашу кодовую базу с C++17 до C++20. Как и ожидалось, ошибок и предупреждений довольно много, но некоторые из них я не совсем могу понять.
В качестве примера приведу некоторые (шаблонные) функции, вызывающие ошибки:

Код: Выделить всё

template 
void delete_all(T& t)
{
for (T::const_iterator it = t.begin(); it != t.end(); ++it)
delete *it;
t.clear();
}

Код: Выделить всё

template
inline T* get_from_TRRefList_by_index(const TRRefList& liste, unsigned int index)
{
assert(!(index >= liste.Count() || index < 0));
TRRefList::Iterator x(liste);

for (unsigned int i = 0; i < liste.Count(); ++i, ++x)
{
if (i == index)
return x.current();
}

return nullptr;
}
Для обеих функций я получаю ошибки C3878, C2760, C2065 и C7510. C2065 я могу понять в контексте, но не другие.
Использую последнюю версию Visual Studio 22, которая на данный момент — 17.14.24.
По запросу полные ошибки:

Код: Выделить всё

Severity    Code    Description Project File    Line    Suppression State   Details
Error   C3878   syntax error: unexpected token 'it' following 'expression'  DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2760   syntax error: ')' was unexpected here; expected ';' DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2065   'it': undeclared identifier DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2065   'it': undeclared identifier DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2760   syntax error: ')' was unexpected here; expected ';' DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C3878   syntax error: unexpected token ')' following 'expression-statement' DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2065   'it': undeclared identifier DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    10
Error   C3878   syntax error: unexpected token 'it' following 'expression'  DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2760   syntax error: ')' was unexpected here; expected ';' DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2065   'it': undeclared identifier DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2065   'it': undeclared identifier DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2760   syntax error: ')' was unexpected here; expected ';' DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C3878   syntax error: unexpected token ')' following 'expression-statement' DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    9
Error   C2065   'it': undeclared identifier DM_Data D:\Dev\DutySuiteVS17_test2\3p\conan\include\TRConan\delete_all.h    10
Error   C3878   syntax error: unexpected token 'x' following 'expression'   DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 173
Error   C2760   syntax error: ')' was unexpected here; expected ';' DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 173
Error   C3878   syntax error: unexpected token ')' following 'expression-statement' DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 173
Error   C7510   'Iterator': use of dependent type name must be prefixed with 'typename' DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 173
Error   C3878   syntax error: unexpected token 'x' following 'expression'   DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 188
Error   C2760   syntax error: ')' was unexpected here; expected ';' DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 188
Error   C3878   syntax error: unexpected token ')' following 'expression-statement' DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 188
Error   C7510   'Iterator': use of dependent type name must be prefixed with 'typename' DM_Data D:\Dev\DutySuiteVS17_test2\dutymanager2\DM_Data\Utilities.h 188
Вот MCVE.

Код: Выделить всё

#include 

template 
void delete_all(T& t)
{
for (T::const_iterator it = t.begin(); it != t.end(); ++it)
delete *it;
t.clear();
}

void test(std::vector& v) {
delete_all(v);
}
Оказывается, проблема в обоих случаях заключалась в отсутствующем имени типа. Я хотел бы передать решение @MarekR, даже если я не могу этого сделать, поскольку вопрос закрыт.


Подробнее здесь: https://stackoverflow.com/questions/798 ... -msvc-2022
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»