Наследование от специализированной шаблонной структуры / класса - PullRequest
3 голосов
/ 28 февраля 2012

Можно ли наследовать специализированную структуру / класс, как показано ниже?

template<class TKey, class TData>
struct Container
{
    virtual void Add(TKey key, TData data) = 0;
};

template<class TData>
struct Container<int, TData>
{
    virtual void Add(int key, TData data) = 0;
};

struct TicketContainer : public Container<std::string>
{
    void Add(int key, std::string data)
    {
    }
};

Я получаю ошибки в объявлении TicketContainer, жалующемся на слишком мало объявленных параметров шаблона.

1 Ответ

5 голосов
/ 28 февраля 2012

Изменить:

struct TicketContainer : public Container<std::string>

на:

struct TicketContainer : public Container<int, std::string>

или другой тип для TKey.

Даже если вы указали частичную специализацию Container вам все равно нужно указать оба параметра шаблона.

Вы можете указать типы по умолчанию для параметров шаблона, если вы не хотите указывать оба параметра шаблона.В этом случае вам придется изменить порядок TKey и TValue (что может быть нелогичным, поскольку ассоциативные контейнеры обычно объявляются key затем value):

// Reordered 'TData' and 'TKey'.
template<class TData, class TKey = int>
struct Container
{
    virtual void Add(TKey key, TData data) = 0;
};

template<class TData>
struct Container<TData> // Equivalent to 'struct Container<TData, int>'
{
    // This specialization seems pointless as it defines no
    // special behaviour.
    virtual void Add(int key, TData data) = 0;
};

struct TicketContainer : public Container<std::string>
{
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...