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)不匹配).
是否可以在另一个类中实现访问者模式?为什么我的前瞻声明不起作用?
当你这样做
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)
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |