C ++在派生类中重载了模板函数

时间:2012-08-27 17:49:23

标签: c++ templates

我知道你可以根据模板参数重载模板:

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个版本?

2 个答案:

答案 0 :(得分:2)

与往常一样,派生类中定义的名称隐藏了基类中相同名称的使用。要将基类中的名称提升到派生类中,请添加

using A::test;

到派生类。

答案 1 :(得分:0)

您正在观察的内容称为名称隐藏。派生类中的名称test在基类中隐藏test。没有using声明,当通过该对象的确切类型调用时,永远不会找到该名称(强制转换为基础或明确限定该调用也有帮助)。