首页 > 解决方案 > C++:递归模板参数错误

问题描述

我已经习惯在 Delphi/Lazarus 中这样编码:

type
    TPair<TKey, TValue> = record
        Key:TKey;
        Value:TValue;
    end;
    TAbstractList<T> = class
    end;
    TAbstractPairList<TKey, TValue> = class(TAbstractList<TPair<TKey, TValue>>)
    end;

而且我认为,C++ 中的模板更加强大。但...

#include <stdio.h>

template <class TKey, class TValue>
struct TPair
{
    TKey Key;
    TValue Value;
};

template <class T>
class TAbstractList
{
    public:
    virtual void DoSomething() = 0;
};

template <class T>
class TList:public virtual TAbstractList<T>
{
    public:
    virtual void DoSomething() {
        printf("%s", "Implementation!");
    };
};

template <class TKey, class TValue>
class TAbstractPairList:public virtual TAbstractList<TPair<TKey, TValue>>
{

};

template <class TKey, class TValue>
class TPairList:public virtual TAbstractPairList<TKey, TValue>,
                       virtual TList<TPair<TKey, TValue>>
{

};

TAbstractPairList<int, int> *List;

int main()
{
    List = new TPairList<int, int>;
    List->DoSomething();
    delete List;
};

此代码在在线 C++ 编译器中编译,例如https://www.onlinegdb.com,但无法在真实的 C++ 编译器中编译,例如 Borland C++ Builder。

即这个有效:

typedef TPair<int, int> TMyPair;
TAbstractList<TMyPair> *List;

但是这个没有:

TAbstractList<TPair<int, int>> *List;

而且我不能将“typedef”放在“模板”和“类”之间。

这段代码有什么问题?为什么在某些 C++ 编译器中不能使用递归模板参数?这个问题能以某种方式解决吗?

标签: c++templatesmultiple-inheritance

解决方案


推荐阅读