Перегрузка возвращаемого типа со специализацией шаблона? - PullRequest
0 голосов
/ 21 февраля 2012
class Base
{
public:
    string Test() { return "hi"; }
};

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

Я хочу "привет" из базы.Как можно заставить string s = Derived().Test() работать?И нет, Test не имеет параметров.

Я пробовал using Base::Derived, но кажется, что перегруженные функции, которые отличаются только типами возвращаемых данных, не наследуются / не предоставляются.Я не могу ссылаться на Base из кода клиента, так как Base будет сгенерировано шаблономКлиент знает тип, который он хочет.Я не мог заставить Test<string>() работать через наследование.

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Если вы на 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

1 голос
/ 10 июля 2013

Вот так: string s = Derived().Base::Test();

Ваш компилятор не будет выполнять квест через базовые типы, но найдет правильную функцию, если вы скажете, где искать.

1 голос
/ 21 февраля 2012

Это потому что ты не перегружаешь, а прячешься.

Необходимо выполнить приведение к базовому классу.

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

Нельзя перегрузить функции на основе типа возврата:

1.3.11 подпись

информация о функции, которая участвует в разрешении перегрузки (13.3): ее список типов параметров (8.3.5) и, если функция является членом класса, квалификаторы cv (если есть) всама функция и класс, в котором объявлена ​​функция-член.[...]

...