从专门的模板结构/类继承

时间:2012-02-27 21:40:52

标签: c++ inheritance template-specialization

是否可以继承像下面这样的专门结构/类?

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 个答案:

答案 0 :(得分:5)

变化:

struct TicketContainer : public Container<std::string>

为:

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

TKey的其他类型。

即使您提供了Container的部分专业化,您仍需要指定两个模板参数。

如果您不想同时指定两个模板参数,则可以指定模板参数的默认类型。在这种情况下,您必须重新排序TKeyTValue(这可能是反直觉的,因为关联容器通常被声明为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>
{
};