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