2014-09-03 24 views
8

Oto mój kod:Nie powinien char * niejawnie przekonwertować na std :: string?

#include <iostream> 
using namespace std; 

struct ST {}; 

bool operator==(const struct ST *s1, const string &s2) { 
    return true; 
} 

int main() { 
    struct ST *st = new ST(); 
    const char *p = "abc"; 

    if (st == p) { 
     return 0; 
    } 

    return 1; 
} 

otrzymuję błąd kompilacji:

prog.cpp:14:12: error: comparison between distinct pointer types ‘ST*’ and ‘const char*’ lacks a cast [-fpermissive] 
    if (st == p) { 
      ^

Zastanawiam się dlaczego niejawna konwersja z char * na ciąg nie działa tutaj?

UPDATE odpowiedź Antona sens, I uaktualniony kod:

#include <string> 
using namespace std; 

struct ST {}; 

bool operator==(const struct ST s1, const string &s2) { 
    return true; 
} 

int main() { 
    struct ST st; 
    const char *p = "abc"; 

    if (st == p) { 
     return 0; 
    } 

    return 1; 
} 

teraz kompiluje.

+3

Tutaj można porównać różne typy wskaźników. Twój przeciążony operator nie jest wywoływany. – 101010

+2

Nie dotyczy Twojego problemu, ale ''include ' nie jest tutaj wymagane. '#include ' jest. –

Odpowiedz

17

§13.3.1.2 Operators in expressions [over.match.oper] stany:

If no operand of an operator in an expression has a type that is a class or an enumeration, the operator is assumed to be a built-in operator and interpreted according to Clause 5.

To jest dokładnie to twoja sprawa: operator== „s argumenty są wskaźnikami, więc jest to uważane za wbudowane i kompilator nie wygląda za ewentualne przeciążenia.

0

Absolutnie nie.

Przede wszystkim próbujesz użyć wskaźnika zamiast odniesienia. Wszelkie podobieństwo między wskaźnikiem a odwołaniem jest szczegółem implementacji. Zapamiętaj hasło: "Wdrożenie nie ma znaczenia".

Następnie, a bardziej bezpośrednio na twoje pytanie, std :: string i char * są całkiem inne, nawet jeśli są używane do reprezentowania tych samych rzeczy. Konwersja między nimi była umyślnie utrudniona, aby zapobiec korzystaniu z nich w sposób wymienny.

+5

Myślę, że przegapiłeś to, chociaż 'st == p' jest odrzucany,' operator == (st, p) 'jest całkowicie poprawny i ma dokładne zachowanie, które OP ma nadzieję uzyskać za pomocą' st == p'. Ciąg 'const & 'można zainicjować z tymczasowego typu' string', a tymczasowy typ 'string' można skonstruować z' const char * '. – hvd

Powiązane problemy