考虑一个例子:
#include <iostream>
#include <vector>
template <class, class T>
using alias = T;
template <template <class...> class>
struct tt_wrapper{};
template <class...>
struct t_wrapper{};
struct A {
template <template <class...> class TT, class T>
void foo(alias<tt_wrapper<TT>, T>) { std::cout << "A::foo invoked" << std::endl; }
};
struct B: A {
using A::foo;
template <class U, class T>
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
};
int main() {
B b;
b.foo<std::vector>(int{});
}
当using声明将基类中的名称带入派生类时 类范围,成员函数和成员函数模板 派生类覆盖和/或隐藏成员函数和成员 具有相同名称的函数模板,参数类型列表, 基类中的cv-qualification和ref-qualifier(如果有的话)(相反) 而不是冲突的)。
显然模板参数不应该包含在成员函数隐藏中。但是在我们的示例中,模板参数使用别名引入签名。然而,clang似乎并不认为别名是函数 parameter-type-list 的一部分并声称:
prog.cc:26:7: error: no matching member function for call to 'foo'
b.foo<std::vector>(int{});
~~^~~~~~~~~~~~~~~~
prog.cc:21:10: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'U'
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
^
1 error generated.
我在内容中省略了gcc,因为它涉及隐藏过程中的模板参数列表。 clang对吗?
答案 0 :(得分:2)
A::foo
和B::foo
已
foo
)T
!!!)const
,不是易变的)不考虑模板参数列表。
基类中的方法不是虚拟的,因此隐藏而不是覆盖。
Demo参数类型列表为T
。