从专用模板结构/类继承

Inheriting From Specialized Template Struct/Class

本文关键字:继承 结构 专用      更新时间:2023-10-16

是否可以继承以下这样的特殊结构/类?

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声明中遇到错误,抱怨声明的模板参数太少。

更改:

struct TicketContainer : public Container<std::string>

至:

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

或者CCD_ 2的某种其它类型。

即使您已经提供了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>
{
};