我正在使用以下代码段。
当我实例化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>::mKeyTemplateClass<double>::mKey是两个不同的对象。从意义上说,它们都是static,它们与任何一种类型的任何实例都不相关,但是类模板TemplateClass<int>的两个实例TemplateClass<double>TemplateClass是不同的类类型,因此它们的所有成员也都是不同。

对于任何不同的类型TU,类类型TemplateClass<T>TemplateClass<U>是完全独立的类类型,由于它们是从同一类模板实例化的,因此它们恰好具有相似的结构。

您可以(在大多数情况下)很好地定义两个非模板类TemplateClassIntTemplateClassDouble,其中所有提到T的内容在第一个中被int替换,在第二个中被double

关于c++ - 我们如何在模板类中使用静态映射,在模板类的每个实例化中都应使用相同的映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57724362/

10-10 16:27