2014-11-11 19 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 dice:C++ Perché la chiamata è ambigua?

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

Quale tipo di argomento viene fornito come secondo parametro? Chiedo principalmente per curiosità; Probabilmente non mi sarà di grande aiuto. – Tommy

+0

Grazie a tutti! return ((const myClass * const) this) -> get (0L, to); lavorato. –

risposta

26

Entrambe le chiamate di funzione richiedono una conversione di tipo:

  • richiamo della funzione void* richiede l'aggiunta di un qualifer const per this
  • richiamo della funzione bool richiede conversione to da void* a bool.

Quindi, con le regole di risoluzione del sovraccarico, nessuna delle due è una corrispondenza "migliore" dell'altra e la chiamata è considerata ambigua.

Forse è possibile aggiungere const alla seconda funzione; forse potresti rimuoverlo dal primo (anche se preferirei non farlo); forse puoi eseguire una conversione di tipo esplicito di this o to per forzare l'override preferito.

+1

Un'opzione aggiuntiva è solo l'aggiunta di un sovraccarico non-'' '' '' '' 'quello', che è probabilmente una funzione inline definita in classe. – Deduplicator

+1

Grazie, ma sono piuttosto nuovo in C++ e non riesco a intercettarlo, perché non posso chiamare il metodo const da non-const? Questo è un esempio, e tstfn deve essere NOT const, mentre get (long, void *) - const. E come posso rendere "questo" const? –

+1

@ ВладимирТкачёв È * possibile * chiamarlo, il problema è che ci sono due scelte ugualmente buone per 'get()' - quale si desidera chiamare? Se tu avessi uno o l'altro, la chiamata andrebbe bene. Rendere 'this' const è solo' const_cast (this) '. – Barry

12

Perché void *get(long i, void* const to) è const.

Ciò significa che chiamando dal tstfn (che è non-const) richiederebbe conversione qualificazione this da myClass* a const myClass*, in modo da chiamare entrambe le funzioni richiederebbe una conversione per gli argomenti (this è trattata nello stesso modo di altri argomenti), quindi la chiamata è ambigua.

5

Semplicemente perché è testfn una funzione non const, che chiamerebbe la versione non costante di get. La funzione non costante get, prende bool non const void*. Aveva una sola funzione get (probabilmente prendendo void* come secondo argomento, indipendentemente dalla sua costanza).

+0

Questa è una risposta sbagliata, perché ciecamente +1? – Slava

+0

@Slava In realtà è +2 – Chantola

+0

Perché sbagliato? Cura di spiegare. – Ajay

Problemi correlati