Josh_0101 Ответов: 1

Синтаксическая ошибка при использовании инициализации фигурных скобок в VS2008


Привет, я пытаюсь определить структуру (инициализация скобок, имеет конструктор) для векторной функции, но она не была скомпилирована и показала эти ошибки.
error C2059: syntax error : ','
error C2334: unexpected token(s) preceding '{'; skipping apparent function body
error C2143: syntax error : missing ';' before '}'
Я пробовал работать на Visual Studio 2019, она отлично работает. Но по какой-то причине я должен запустить его в Visual Studio 2008. Я использую приложение Visual C++ MFC.

Похоже, что нужно сделать несколько конверсовион? Есть идеи?

Спасибо.

Инициализация фигурных скобок для классов, структур и объединений | Microsoft Docs[^]

Что я уже пробовал:

struct LISTDATA 
{
	std::string name_;
	RECT rect_;

	LISTDATA(const std::string& name, RECT rect): name_{name}, rect_{rect} {}
};

std::vector<LISTDATA> vecListData;

1 Ответов

Рейтинг:
6

Richard MacCutchan

Этот синтаксис находится в более поздней версии компилятора, чем тот, который предоставляется VS2008. Вам следует перейти на VS2019.


Josh_0101

Привет, есть ли какой-нибудь способ определить подобную структуру в VS2008?

Richard MacCutchan

Структура в порядке, это конструктор, который нуждается в изменении. Попробуйте выполнить следующие действия, используя круглые скобки, а не фигурные скобки вокруг значений инициализатора.

LISTDATA(const std::string& name, RECT rect): name_(name), rect_(rect) {}

Josh_0101

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

ошибка C2601: 'rect' : определения локальных функций являются незаконными
ошибка C2143: синтаксическая ошибка : отсутствует ';' перед '}'
ошибка C2065: 'name' : необъявленный идентификатор
ошибка....

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char name[100];
    RECT rect{0};

    GetClassNameA(hwnd,name, sizeof(name));
    ::GetWindowRect(hwnd, &rect);

    std::vector<listdata>* myVec = reinterpret_cast<std::vector<listdata>*>(lParam);

    if (myVec) {
      myVec->emplace_back(LISTDATA(std::string(name), rect));
    } else {
      
     return FALSE;
    }

    return TRUE;
}
<\pre>

Richard MacCutchan

Посмотрите на номер строки в сообщении об ошибке, и он подскажет вам, где проверить. И снова вы используете синтаксис, который не является допустимым в вашей версии компилятора.

RECT rect{0};

Josh_0101

Да, это 1 из проблем, которые я не знаю, как определить массив для `RECT` другим способом, чтобы сделать его допустимым в моей версии компилятора..

Richard MacCutchan

Вы не объявляете массив, вы просто объявляете одну переменную RECT. Но вам не нужно инициализировать его до нуля, так как первая ссылка находится на GetWindowRect(hwnd, &rect); которая будет его заменить.

Если вы должны использовать современные функции C/C++, то вам нужно перейти на VS2019.

Josh_0101

Я вижу. Я думал, что это такой же массив, как и символ, и продолжаю искать решение для этого..

Как я могу объявить/инициализировать RECT в этом обратном вызове? До сих пор я не нашел примера для этой проблемы, и определенно я должен использовать VS2008, чтобы запустить его.

Richard MacCutchan

Как я уже сказал выше, он будет инициализирован вызовом GetWindowRect(), поэтому он не нуждается в какой-либо предварительной инициализации. Все что вам нужно в коде это

RECT rect;


Я предполагал, что вы написали этот код, но ваши комментарии предполагают, что вы скопировали его откуда-то еще. Если я прав, то, возможно, стоит прояснить это в вашем вопросе.

Josh_0101

Спасибо, и это работает! Я получаю ошибку из-за какой-то опечатки, когда делаю изменения. Просто нуждаться RECT rect; вместо RECT rect {0};