我对“模板模板”的概念感到有点困惑。例如,这可以编译:
nameValues.Remove("key1");
我很困惑,template<typename X1>
class T1 {};
template<class X2, template<typename X> class T >
class TT {};
int _tmain(int argc, _TCHAR* argv[])
{
TT<int, T1> tt1; //compile ok
//TT<int, T1<int>> tt2; //compile error
return 0;
}
定义为类型参数tt1
提供int
,为模板类型参数X2
提供T1
,这些是一切都很好......但是T
本身需要一个类型T1
,如果没有提供,C ++编译器如何编译?
答案 0 :(得分:3)
您需要区分类模板和类模板实例。实例化是一种实际类型,而模板本身不是一种类型,它更像是一个类型的名称。
参数T
应该是一个模板,通俗地说一系列类型。对于tt1
,您确实以T1
。
但是在失败的尝试中,您没有提供模板,您提供了一种类型(通过实例化T1
)。 T1<int>
不是模板,而是某个类。
我猜你抛出的是你命名T
(X
)参数的事实。您提供的名称与TT
的声明完全相同。它期望模板作为其第二个参数,而不是模板及其参数。事实上,X
没有TT
可供参考。您可以尝试,编译器会抱怨它不知道X
是什么。