2010-02-15 5 views
18

Próbuję przykład z książki C++ Bjarne Stroustrup, trzecie wydanie. Podczas implementowania raczej prostej funkcji pojawia się następujący błąd kompilacji:Błąd kompilacji C++: ISO C++ zabrania porównywania wskaźnika i liczby całkowitej

error: ISO C++ forbids comparison between pointer and integer 

Co może być przyczyną? Oto kod. Błąd jest w linii if:

#include <iostream> 
#include <string> 
using namespace std; 
bool accept() 
{ 
    cout << "Do you want to proceed (y or n)?\n"; 
    char answer; 
    cin >> answer; 
    if (answer == "y") return true; 
    return false; 
} 

Dzięki!

+10

y w kodzie jest ciągiem dosłowny (cudzysłowy) ' ""', A char jest tylko (pojedyncze cudzysłowy) '' '' – Alex

+1

Sprawdź swoje pisanie. Przykład w Stroustup ma 'char odpowiedź = 0;' i 'if (odpowiedź == 'y') zwraca true;'. –

Odpowiedz

30

Istnieją dwa sposoby, aby to naprawić. Preferowanym sposobem jest użycie:

string answer; 

(zamiast char). Drugim możliwym sposobem, aby to naprawić to:

if (answer == 'y') ... 

(uwaga pojedyncze cudzysłowy zamiast podwójne, reprezentujących char stałych).

4

Potrzebujesz zmienić znaki podwójnego cudzysłowu na single. tj. if (answer == 'y') zwraca true;

Oto kilka informacji na ciąg literale w C++: http://msdn.microsoft.com/en-us/library/69ze775t%28VS.80%29.aspx

+1

Masz na myśli, że podwójne cudzysłowy nie są wymienialne w C++? – Morlock

+4

Nie, podwójne cudzysłowy to "char []" (kilka znaków), pojedyncze cudzysłowy to pojedynczy znak "char". –

+0

właśnie wysłał link do biblioteki msdn. – Craig

2

"y" jest ciągiem/matryca/wskaźnik. "y" jest znakiem typu całkowego/całkowego:

6

Literał łańcuchowy jest rozdzielany cudzysłowem i ma typ char * not char.

Przykład: "hello"

Więc jeśli porównać char do char * dostaniesz ten sam błąd kompilacji.

char c = 'c'; 
char *p = "hello"; 

if(c==p)//compiling error 
{ 
} 

Aby naprawić, użyj literału znaków, który jest oddzielony pojedynczymi cudzysłowami.

Przykład: 'c'

0

Musisz pamiętać, aby używać pojedynczych cudzysłowów do stałych znakowych. więc używać

if (answer == 'y') return true;

Zamiast

if (answer == "y") return true;

testowałem to i działa