2016-06-08 12 views
5

Ho il seguente pezzo di codice:Perché compilatore non vede il metodo di classe di base quando si utilizza CRTP

struct Iface 
{ 
    virtual int Read() = 0; 

    int Read(int x) { 
     return Read() + x; 
    } 
}; 

template <typename Impl> 
struct Crtp : public Iface 
{ 
    virtual int Read() { 
     return static_cast<Impl&>(*this).ReadImpl(); 
    } 
    //using Iface::Read; 
}; 

struct IfaceImpl : public Crtp<IfaceImpl> 
{ 
    int ReadImpl() { 
     return 42; 
    } 
}; 

int main() 
{ 
    IfaceImpl impl; 
    impl.Read(24); // compilation error 

    Iface& iface = impl; 
    iface.Read(24); // always compiles successfully 
} 

Entrambi msvc, gcc e clang rifiutano questo codice, non possono trovare il metodo Read(int x)

Tuttavia se ho decommentato using Iface::Read in Crtp il mio codice viene compilato correttamente.

Nota che se prendo un riferimento alla Iface posso chiamare Read(int x)

Perché accade questo?

risposta

7

Perché ciò accade?

Il tuo problema non ha nulla a che fare con CRTP. È un problema che nasconde un nome che può accadere in uno scenario di ereditarietà normale.

Quando si chiama impl.Read(24);, non è possibile trovare il nome funzione membro Read nell'ambito di classe IfaceImpl. Quindi verrà esaminato l'ambito della classe di base Crtp e trovato il nome Read. Quindi i fermi di ricerca del nome, quindinell'ulteriore classe base Iface non verranno considerati per la risoluzione di sovraccarico, anche se è più appropriato qui.

Per using Iface::Read; si introduce il nome Read nell'ambito di classe Crtp. Quindi potrebbe essere trovato e selezionato correttamente dalla risoluzione di sovraccarico.

E se si chiama tramite il riferimento Iface, la ricerca del nome funzionerà correttamente.

Oppure è possibile chiamarlo esplicitamente (e brutto) per impl.Iface::Read(24);.

Vedi Unqualified name lookup:

... nome di ricerca esamina gli scopi descritti di seguito, finché trova almeno una dichiarazione di qualsiasi tipo, momento in cui la ricerca si ferma e ulteriori scopi vengono esaminati.

Problemi correlati