Cin.ignore(numeric_limits <streamsize>:: max(), '\n'); max() не распознает

Я беру ввод на С++, и я использую VStudio 2013 на Win7. Я пытаюсь избежать неправильного ввода данных из моих меню, и он работает во всех них, кроме этого.

    cout << "Please choose your second number" << endl;
    cin >> move2;

    if (move2 < 1 || move2 > size)
    {
        cout << "That not a valid move" << endl;
        Sleep(2000);
        cin.sync();
        cin.clear();
    }

Единственное различие заключается в том, что в условии move > переменной (size) нет числа. Когда я вхожу в char, он возвращается к вопросу, запрашивая другой ввод, но если я введу слово, оно сломается!

Я пытаюсь использовать cin.ignore(numeric_limits<streamsize>::max(), '\n');, но компилятор выделяет max(), и он говорит "ожидающий идентификатор".

Это может быть легко для всех вас хорошими программистами, но я не знаю, как это исправить. Кто-нибудь может мне помочь?

Ответ 1

Это связано с тем, что в Visual Studio при использовании окон он будет определять макрос max(). Если вы наведите указатель мыши на max() в своем примере, вы должны получить предупреждение intellisense. Вы можете решить эту проблему, указав max после всех своих включений и перед любым кодом.

#undef max

Ответ 2

Чтобы использовать std::numeric_limits<T>, вам нужно включить <limits>. Кроме того, тип, переданный ему, должен быть известен и фактически тип std::streamsize, то есть я буду использовать его как

#include <iostream>
#include <limits>
// ...
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Кроме того, вероятно, вы должны убедиться, что ваша попытка прочитать что-то была фактически успешной, и если это не так, сначала clear() состояние потока. Вот полная программа (она, конечно, компилируется и работает с gcc и clang):

#include <iostream>
#include <limits>

int main()
{
    int move2, size(3);
    while (!(std::cin >> move2) || move2 < 1 || size < move2) {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "invalid input ignored; please enter a valid move\n";
    }
    std::cout << "move2=" << move2 << '\n';
}

Ответ 3

Если cin имеет ошибку, следующее очистит состояние ошибки, а затем прочитает оставшуюся часть строки.

if(!cin)
{
   cin.clear();
   string junk;
   getline(cin, junk);
}

Ответ 4

Включить:

#include <climits> 

и посмотрим, поможет ли это. У меня была такая же проблема, и когда я изменил ее с пределов до климатических условий, это было решено.