2014-09-03 19 views
8

Đây là mã của tôi:Không nên char * ngầm chuyển thành 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; 
} 

tôi nhận biên dịch báo lỗi:

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

Tôi tự hỏi tại sao chuyển đổi ngầm từ char * để chuỗi không làm việc ở đây?

CẬP NHẬT câu trả lời Anton của ý nghĩa, tôi cập nhật mã:

#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; 
} 

Bây giờ nó biên dịch.

+3

Bạn so sánh các loại con trỏ khác nhau tại đây. Toán tử quá tải của bạn không được gợi lên. – 101010

+2

Không liên quan đến vấn đề của bạn, nhưng '#include ' không bắt buộc ở đây. '#include ' is. –

Trả lời

17

§13.3.1.2 Operators in expressions [over.match.oper] trạng thái:

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.

Đây chính là trường hợp của bạn: operator== luận 's là con trỏ, vì vậy nó được coi là được tích hợp và biên dịch không tìm kiếm quá tải có thể.

0

Tuyệt đối không.

Trước hết, bạn đang cố gắng sử dụng con trỏ thay cho tham chiếu. Bất kỳ điểm tương đồng nào giữa một con trỏ và tham chiếu là một chi tiết thực hiện. Hãy nhớ phương châm: "Thực hiện là không thích hợp!"

Tiếp theo và trực tiếp hơn cho câu hỏi của bạn, chuỗi std :: và char * khá khác nhau, ngay cả khi chúng được sử dụng để đại diện cho cùng một thứ. Việc chuyển đổi giữa chúng được cố ý gây khó khăn để ngăn chặn việc sử dụng chúng hoán đổi cho nhau.

+5

Tôi nghĩ rằng bạn đã bỏ lỡ rằng mặc dù 'st == p' bị từ chối,' operator == (st, p) 'là hoàn toàn hợp lệ và có hành vi chính xác mà OP hy vọng nhận được với' st == p'. Một 'const string &' có thể được khởi tạo từ một tạm thời kiểu 'string', và một tạm thời của kiểu' string' có thể được xây dựng từ 'const char *'. – hvd

Các vấn đề liên quan