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?