我习惯在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,但无法在实际编译中编译,如Borland C ++ Builder。
即。这个有效:
typedef TPair<int, int> TMyPair;
TAbstractList<TMyPair> *List;
但是这个没有:
TAbstractList<TPair<int, int>> *List;
我不能把“typedef”放在“template”和“class”之间。
这段代码有什么问题?为什么在某些C ++编译器中无法使用递归模板参数?这个问题能以某种方式解决吗?