2014-11-11 37 views
15
class myClass { 
    int arr[100]; 
public: 
    void *get(long i, void* const to) const; 
    void *get(long i, bool nog); 
    void *tstfn(void* const to) { return get(0L,to); } 
}; 

gcc -Wall nói:C++ Tại sao cuộc gọi không rõ ràng?

dt.cpp: In member function ‘void* myClass::tstfn(void*)’: 
dt.cpp:6:49: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default] 
dt.cpp:4:9: note: candidate 1: void* myClass::get(long int, void*) const 
dt.cpp:5:9: note: candidate 2: void* myClass::get(long int, bool) 
+1

Loại đối số nào bạn cung cấp làm tham số thứ hai? Tôi hỏi chủ yếu là tò mò; Tôi không thể giúp được gì nhiều. – Tommy

+0

Cảm ơn tất cả! trả về ((const myClass * const) điều này) -> get (0L, to); đã hoạt động. –

Trả lời

26

Cả hai cuộc gọi chức năng đòi hỏi một loại chuyển đổi:

  • gọi void* chức năng đòi hỏi thêm một qualifer const để this
  • gọi bool chức năng đòi hỏi phải chuyển đổi to từ void* để bool.

Vì vậy, theo quy tắc giải quyết quá tải, không phải là kết hợp "tốt hơn" so với quy tắc khác và cuộc gọi được coi là mơ hồ.

Có lẽ bạn có thể thêm const vào hàm thứ hai; có lẽ bạn có thể loại bỏ nó từ lần đầu tiên (mặc dù tôi không muốn); có lẽ bạn có thể thực hiện chuyển đổi loại rõ ràng là this hoặc to để ép buộc ghi đè ưa thích của bạn.

+1

Một tùy chọn bổ sung chỉ là thêm một quá tải không 'const' gọi 'const', có thể là một hàm nội tuyến được xác định trong lớp. – Deduplicator

+1

Cảm ơn, nhưng tôi khá mới với C++ và không bắt được, tại sao tôi không thể gọi phương thức const từ không phải là const? Đây là một ví dụ, và tstfn là NOT const, trong khi nhận được (long, void *) - const. Và làm thế nào tôi có thể làm cho 'điều này' const? –

+1

@ ВладимирТкачёв Bạn * có thể * gọi nó, vấn đề là có hai lựa chọn tốt như nhau cho 'get()' - cái nào bạn muốn gọi? Nếu bạn đã có một hoặc khác, cuộc gọi sẽ là tốt. Việc tạo 'this' const chỉ là' const_cast (this) '. – Barry

12

void *get(long i, void* const to)const.

này có nghĩa là gọi đó là từ tstfn (đó là không const) sẽ yêu cầu chuyển đổi trình độ chuyên môn cho thismyClass*-const myClass*, cho nên gọi cả hai chức năng sẽ đòi hỏi một sự chuyển đổi cho các đối số (this được xử lý trong cùng một cách như khác đối số), vì vậy cuộc gọi không rõ ràng.

5

Đơn giản chỉ vì bạn testfn là chức năng không phải const, gọi là phiên bản không const là get. Hàm phi const get, mất bool không phải const void*. Chỉ có một hàm get ở đó (có thể lấy void* làm đối số thứ hai, không phân biệt độ chói của nó) sẽ được gọi.

+0

Đây là câu trả lời sai, tại sao một cách mù quáng +1? – Slava

+0

@Slava Nó thực sự là +2 – Chantola

+0

Tại sao sai? Quan tâm để giải thích. – Ajay

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