Я пытаюсь реализовать шаблон посетителя внутри другого класса. MWE:
struct super
{
struct base
{
virtual void accept(struct visitor& v);
virtual ~base() {}
};
struct visitor
{
virtual void visit(base& b);
virtual ~visitor() {}
};
struct special : public base
{
void accept(visitor& v) override { v.visit(*this); }
};
};
int main() {}
Это жалуется, что special::accept
на самом деле ничего не отменяет. Я думаю, это из-за того, что struct visitor
отличается от visitor
.
Замена позиции базы и посетителя (и перемещение объявления вперед в visitor::visit
) устраняет эту ошибку (но затем говорит, что аргумент в v.visit(*this)
не будет совпадать).
Можно ли реализовать шаблон посетителя внутри другого класса? Почему моя предварительная декларация не работает?