带模板特化的重载返回类型?

时间:2012-02-20 21:06:25

标签: c++ overloading template-specialization

class Base
{
public:
    string Test() { return "hi"; }
};

class Derived : public Base
{
public:
    int Test() { return 3; }
}

我希望来自Base的“hi”。怎样才能让string s = Derived().Test()工作?不,Test没有参数。

我尝试了using Base::Derived,但似乎只返回类型不同的重载函数不会被继承/暴露。我无法从客户端代码中引用Base,因为Base将是模板生成的。客户端知道它想要的类型。我无法通过继承获得Test<string>()

3 个答案:

答案 0 :(得分:1)

那是因为你没有超载,而是隐藏。

您需要转回基类。

Derived d;
d.Test();  //calls Derived::Test()
static_cast<Base>(d).Test(); //calls Base::Text()

您不能根据返回类型重载函数:

1.3.11签名

  

有关参与重载的函数的信息   resolution(13.3):它的参数类型列表(8.3.5),如果是   function是一个类成员,函数上的cv-qualifiers(如果有的话)   本身和声明成员函数的类。 [...]

答案 1 :(得分:1)

如果您使用的是C ++ 11,则可以执行以下操作:

class Base
{
public:
    string Test() { return "hi"; }
};

class Derived : public Base
{
public:
    template<typename T= decltype(Test())>
    T Test() { return Base::Test(); }
};

检查:http://ideone.com/blXhN

答案 2 :(得分:1)

像这样:string s = Derived().Base::Test();

你的编译器不会通过基类型继续进行任务,但如果你告诉它在哪里看,它会找到合适的函数。