C ++ Verificando por um inteiro.

Novo para C ++. Tendo problemas corretamente em loop ao lidar com erros. Eu estou tentando verificar se a entrada do usuário é um inteiro e é positiva.

do{
    cout << "Please enter an integer.";
    cin >> n;

    if (cin.good())
    {
        if (n < 0) {cout << "Negative.";}
        else {cout << "Positive.";}
    }
    else
    {
        cout << "Not an integer.";
        cin.clear();
        cin.ignore();
    }
}while (!cin.good() || n < 0);

cout << "\ndone.";

Quando um não inteiro é inserido, o loop é interrompido. Eu sinto que estou entendendo mal o uso inerente decin.clear() ecin.ignore() e o status decin durante este loop. Se eu remover ocin.ignore(), o loop se torna infinito. Por que é isso? O que posso fazer para tornar isso um loop funcional? Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion