调用基类时的强制类名'功能?

时间:2018-02-28 09:31:20

标签: c++ templates inheritance function-call

为什么基类'尝试调用基类时需要名称'来自Derived类的模板函数'同名的功能?

考虑以下代码:

struct Base
{
    template < typename >
    void foo() { }
};

struct Derived  : public Base
{
    void foo()
    {
        Base::foo<int>(); // PASSES
        foo<int>(); // FAILS!
    }
    void bar()
    {
        foo<int>(); // Passes if Derived::foo is not there and fails if it is there
    }
};

这是根据标准吗? GCC和clang在这里表现相同。

1 个答案:

答案 0 :(得分:1)

这是名字隐藏。

根据unqualified name lookup的规则,

  

名称查找检查范围如下所述,直到它找到至少一个任何类型的声明,此时查找停止并且不再检查其他范围。

这意味着,在Derived的成员函数中,始终会找到Derived::foo,然后停止名称查找,根本不会考虑Base::foo。然后,您将收到错误消息,其中foo不是模板。

您也可以使用using来解决问题。

struct Derived  : public Base
{
    using Base::foo;
    void foo()
    {
        Base::foo<int>(); // PASSES
        foo<int>(); // PASSES
    }
    void bar()
    {
        foo<int>(); // PASSES
    }
};