【问题标题】:Compile doesn't find non-virtual function [duplicate]编译没有找到非虚函数[重复]
【发布时间】:2021-09-06 22:01:48
【问题描述】:

我正在尝试实现无虚拟回调。我希望以下代码能够编译,因为 Foo 是 Bar 的基础,并且它包含 DoAct(X*) 的实现。但是,如果Bar 没有包含 Foo 的所有方法,编译器就会出错。

编译器不应该能够在没有模糊的情况下选择Foo::DoAct(X*)吗?

Windows 10; MSVC 16.11.2; 64位

error C2664: 'void Bar::DoAct(Y *)': cannot convert argument 1 from 'X *' to 'Y *'
struct X {};
struct Y {};

template<typename T>
struct Foo  {
    void DoAct(X* x) {}
    void DoAct(Y* y) {}

    void Act(X* x) {
        static_cast<T*>(this)->DoAct(x);
    }
};

struct Bar : Foo<Bar> {
    //void DoAct(X*) {}   /// XXX: Works if present, fails if commented.
    void DoAct(Y*) {}
};


TEST_CASE("Test") {
    Bar b;
    X x;

    b.Act(&x);
}

【问题讨论】:

  • 这与虚函数无关,你遇到了“隐藏规则”:isocpp.org/wiki/faq/strange-inheritance#hiding-rule
  • using Foo&lt;Bar&gt;::DoAct; 将使Foo 版本可见。另一种解决方案是在从外部调用函数时显式命名作用域:b.Foo&lt;Bar&gt;::DoAct(&amp;x);

标签: c++


【解决方案1】:

尝试在Bar 中添加using Foo::DoAct。除了它自己的DoAct 之外,这应该将继承的DoAct 带入范围。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多