Что такое ошибка «ожидаемый неполный идентификатор» в C ++? - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь изучить stl: bitmap, но получаю следующую ошибку: Заголовки добавлены - битсет - строка

Я искал другие сообщения SO для этой ошибки, но они не связаны с набором битов.

Мой код

int main(){
    bitset<size> bs;
    bitset<10> bs2(45);
    bitset<13> bs3("1100101");

    cout << "bs: " << bs << endl;
    cout << "bs1: " << bs2 << endl;
    cout << "bs2: " << bs3 << endl;
    cout << endl;

    cout << "bs has " << bs.count() << " set bits" << endl;

    cout << bs.size() << endl;
    cout << bs2.size() << endl;
    cout << bs3.size() << endl;
}

Моя ошибка: ошибка в последних 3 операторах cout.

$ g++ test.cpp 
test.cpp:28:16: error: expected unqualified-id
    cout << bs.size() << endl;
               ^
test.cpp:6:14: note: expanded from macro 'size'
#define size 16
             ^
test.cpp:29:17: error: expected unqualified-id
    cout << bs2.size() << endl;
                ^
test.cpp:6:14: note: expanded from macro 'size'
#define size 16
             ^
test.cpp:30:17: error: expected unqualified-id
    cout << bs3.size() << endl;
                ^
test.cpp:6:14: note: expanded from macro 'size'
#define size 16
             ^
3 errors generated.
$ 

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

У вас, похоже, есть макрос, определенный в test.cpp строке 6, который является строкой, заменяющей вашу попытку вызова функции size.

Ваша строка на самом деле говорит:

cout << bs.16() << endl;
cout << bs2.16() << endl;
cout << bs3.16() << endl;

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

например. #define BITSET_DEFAULT_SIZE 16

Описания ошибок, данные вам компилятором, очень наглядны и сообщают, что причиной этой проблемы является макрос:

test.cpp:28:16: error: expected unqualified-id
    cout << bs.size() << endl; <- this is telling you the starting position of the error
               ^
test.cpp:6:14: note: expanded from macro 'size'
    #define size 16 <- this is telling you a macro is involved, and giving its value

Кроме того, не рекомендуется использовать using namespace std в своих программах, поскольку std содержит так много общих именованных функций. Например, если вы создаете функцию с именем size, вы неожиданно перезаписываете std::size.

Вот хороший пост, указывающий, почему это плохая идея

0 голосов
/ 07 сентября 2018

Используйте

#undef size 

сразу после строки

bitset<size> bs;

Это скроет ваш макрос, а остальная часть кода теперь должна скомпилироваться.

ПРИМЕЧАНИЕ. Это не постоянное исправление. Но если макрос находится в заголовочном файле, который включен во многие файлы, это даст временное исправление. Но использование const в C ++ рекомендуется вместо макроса.

0 голосов
/ 07 сентября 2018

Удалите #define size 16 из вашей программы. Я думаю, вы написали эту строку в верхней части вашей программы.

Макрос

size, который вы определили, конфликтует с size() функцией-членом. Используйте переменную const вместо макросов. Вы должны использовать const int size=16;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...