我知道你可以根据模板参数重载模板:
template <class T> void test() {
std::cout << "template<T>" << std::endl;
}
void test() {
std::cout << "not a template" << std::endl;
}
然后在一些函数中:
test<int>();
test();
将正确解析您想要的2个不同版本的test()中的哪一个。但是,如果我现在在具有继承的类中执行此操作:
class A {
public:
void test() {
std::cout << "A::Test: not a template" << std::endl;
}
};
class B : public A {
public:
template <class T>
void test() {
std::cout << "B::Test: template<T>" << std::endl;
}
};
然后在函数内部:
B b;
b.test<int>();
b.test();
b.test<int>();
有效但b.test();
没有:
error: no matching function for call to ‘B::test()’
note: candidate is:
note: template<class T> void B::test()
为什么有/没有办法根据模板参数正确解析2个版本?
答案 0 :(得分:2)
与往常一样,派生类中定义的名称隐藏了基类中相同名称的使用。要将基类中的名称提升到派生类中,请添加
using A::test;
到派生类。
答案 1 :(得分:0)
您正在观察的内容称为名称隐藏。派生类中的名称test
在基类中隐藏test
。没有using
声明,当通过该对象的确切类型调用时,永远不会找到该名称(强制转换为基础或明确限定该调用也有帮助)。