Перегрузка виртуальных функций в двух разных интерфейсах - PullRequest
0 голосов
/ 07 октября 2010

У меня проблема с интерфейсом, в котором есть части, которые имеют смысл как шаблонные, и части, которые имеют смысл как не шаблонные.Я нахожусь в середине рефакторинга, где я делю это на два разных интерфейса, где более специфический (шаблонный) наследует от другого.Например, скажем, у меня есть интерфейс IArray, он будет содержать такие функции, как Size(), поскольку он не заботится о типе данных.Но у меня был бы другой интерфейс ITArray<DataType>, который имел бы что-то вроде DataType GetElement(...).(Это только для иллюстрации, не кричите на меня, чтобы использовать std :: vector).Причина, по которой я делаю этот рефакторинг, состоит в том, что есть много потребителей не шаблонного интерфейса, и они хотели бы не писать шаблонные функции, которые принимают шаблонный интерфейс, если им не нужен шаблонный тип (обычноextern "C" stuff)

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

#include <iostream>

class IA
{
public:
        virtual void X()=0;
};

template <class DataType>
class ITA : public IA
{
public:
        //If I uncomment this line, it all works!
        //virtual void X()=0;
        virtual void X(DataType d)=0;
};

template <class DataType>
class A : public ITA<DataType>
{
public:
    void X()
    {
        std::cout << "In X" << std::endl;
    }

    void X(DataType d)
    {
        std::cout << "In X, d=" << d << std::endl;
    }
};

template <class DataType>
void DoSomething(ITA<DataType>& I, DataType d)
{
    I.X(); //MSVC can't resolve this since it's in IA, not ITA
    I.X(d);
}

int main(int argc, char* argv[])
{
    A<int> I;
    DoSomething(I,10);
}

Есть ли какой-нибудь способ, которым я могу заставить функции IA появляться в ITA <>, не помещая их туда вручную?Я вижу кошмар обслуживания передо мной.

1 Ответ

0 голосов
/ 07 октября 2010

Вы пытались добавить директиву using?IA::X скрыт A::X.

class A : ...
{
public:
    using IA::X;
    virtual void X(DataType d) = 0; 
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...