2

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

template <class T> void test() {
    std::cout << "template<T>" << std::endl;
}
void test() {
    std::cout << "not a template" << std::endl;
}

然后在一些函数中:

test<int>();
test();

将正确解决您想要的两个不同版本的 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 个版本?

4

2 回答 2

2

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

using A::test;

到派生类。

于 2012-08-27T17:52:45.887 回答
0

您所观察到的称为隐藏名称。派生类中的名称test隐藏test在基类中。如果没有using声明,则在通过该对象的确切类型调用时将永远找不到名称(强制转换为基类或显式限定调用也有帮助)。

于 2012-08-27T17:57:30.930 回答