在C++中转发声明其他嵌套结构

Joh*_*nes 5 c++ inner-classes forward-declaration

我正在尝试在另一个类中实现访问者模式.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() {}
Run Code Online (Sandbox Code Playgroud)

这抱怨special::accept实际上并没有覆盖任何东西.我想这是因为与... struct visitor不同visitor.

交换base和visitor的位置(以及将前向声明移动到visitor::visit)会消除此错误(但随后会说参数v.visit(*this)不匹配).

是否可以在另一个类中实现访问者模式?为什么我的前瞻声明不起作用?

Nat*_*ica 5

当你这样做

virtual void accept(struct visitor& v);
Run Code Online (Sandbox Code Playgroud)

您转发声明visitor 在包含声明的最小命名空间或块范围内.这意味着visitor is scoped to the global namespace in this case.特价'

void accept(visitor& v)
Run Code Online (Sandbox Code Playgroud)

另一方面是抓住了super::visitor.由于这些是不同的类型,编译器是正确的.

你需要做的是将前向声明visitor转移到super范围之内

struct super
{
    struct visitor;
    struct base
    {
        virtual void accept(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() {}
Run Code Online (Sandbox Code Playgroud)