为什么基类'尝试调用基类时需要名称'来自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在这里表现相同。
答案 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
}
};