我正在使用以下代码片段。 当我实例化 TemplateClass 两次(一次使用 int,下一次使用 double(时,我碰巧在 getKey 中看到相同的大小。而 map 是静态的,第二次大小应该是 2。
template<typename T>
class TemplateClass
{
private:
static std::map<int, T> *mKey;
public:
TemplateClass()
{
}
void insert(T value, int count)
{
(*TemplateClass<T>::mKey)[count]=value;
}
long getKey(){return mKey->size();}
};
template<typename T>
std::map<int,T> *TemplateClass<T>::mKey = new std::map<int,T>;
int main()
{
TemplateClass<int> obj1;
obj1.insert(10, 1);
std::cout<<"Object 1 key is: "<<obj1.getKey()<<std::endl;
TemplateClass<double> obj2;
obj2.insert(222.1122, 2);
std::cout<<"Object 1 key is: "<<obj2.getKey()<<std::endl;
return 0;
}
啊,很多事情,尝试使用静态映射的父类。 全球静态地图。
TemplateClass<int>::mKey
和TemplateClass<double>::mKey
是两个不同的对象。从某种意义上说,它们都是static
的,因为它们不与任一类型的任何实例相关联,但是类模板的两个实例化TemplateClass<int>
和TemplateClass<double>
TemplateClass
是不同的类类型,因此它们的所有成员也是不同的。
对于任何不同的T
和U
类型,类类型TemplateClass<T>
和TemplateClass<U>
是完全独立的类类型,由于是从同一类模板实例化的,它们恰好共享相似的结构。
您可以(在大多数情况下(很好地定义两个非模板化类TemplateClassInt
和TemplateClassDouble
,所有提及T
的类在第一个中被int
替换,在第二个中被double
替换。