У меня есть следующий фрагмент кода:Почему компилятор не видит метод базового класса при использовании 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
}
Оба MSVC, GCC и лязг отвергают этот код, они не могут найти метод Read(int x)
Однако если я раскомментирую using Iface::Read
в Crtp
, мой код успешно компилируется.
Обратите внимание, что если я возьму ссылку на Iface я могу назвать Read(int x)
Почему это происходит?