我正在尝试在另一个类中实现访客模式。 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 visitorvisitor不同。

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

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

最佳答案

当你做

virtual void accept(struct visitor& v);

您向前声明visitor in thesmallest namespace or block scope that contains the declaration。这意味着visitor is scoped to the global namespace in this case.特价商品
void accept(visitor& v)

另一方面是抓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() {}

关于c++ - 在C++中向前声明其他嵌套结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54080953/

10-08 21:38