Ich habe das folgende Stück Code:Warum Compiler siehe Methode der Basisklasse nicht, wenn CRTP mit
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
}
Sowohl msvc, gcc und Klirren diesen Code ablehnen, können sie nicht Methode Read(int x)
Allerdings finden Wenn ich using Iface::Read
in auskommentiere, kompiliert mein Code erfolgreich.
Beachten Sie, dass, wenn ich einen Verweis auf Iface nehme ich anrufen kann Read(int x)
Warum ist das passiert?