2015-03-02 59 views
0

我想在C++中声明一个使用模板的无序映射。但是,正如我期望的对象是原始数据类型之一,我不想为一个对象声明自定义类。使用模板的C++无序映射

我已经尝试使用:

template <class T> std::unordered_map<int, T> storedObj; 

,但我不断收到错误:'storedObj' 没有在这个范围内声明

的代码片断低于

#include<iostream> 
#include<unordered_map> 
#include<deque> 



     std::deque<int> freeIds; 
     template <class T> std::unordered_map<int, T> storedObj; 
      unsigned static int objIdCount=0; 
     const unsigned long int MAXID = 1000000000; 

你能告诉我有什么问题吗?谢谢。

回答

1

您在这里做partial template specialisation(请参阅http://en.cppreference.com/w/cpp/language/partial_specialization)。可能你想到的是类似于typedef的构造,但它不适用于模板。

使用部分模板专业化,您可以(部分)重新实现或重新定义模板类型。

一个实现自己的目标,方式可以是:

template <class T> 
class my_unordered_map : 
    public std::unordered_map<int, T> 
{ 
}; 

int main(void) { 
    my_unordered_map<float> mf; 

    return 0; 
} 
0

模板用于编译时多态性。如果不指定该模板的实际数据类型,则不能实例化基于模板的类。

使用模板的基本方法是:

#include <iostream> 
using namespace std; 

template <class T> 
class MyClass { 
    T foo; 
public: 
    MyClass(T bar) { 
     foo = bar; 
    } 
    void print() { 
     cout << foo; 
    } 
}; 

int main() { 
    MyClass<int> c(5); 
    c.print(); // prints 5 
    return 0; 
} 

你可以达到你想要做什么通过扩展(获得)的unordered_map类,像这样:

#include <iostream> 
#include <unordered_map> 
using namespace std; 

template <class T> 
class MyClass: public unordered_map<int, T> { 
    // optional extra code here 
}; 

int main() { 
    MyClass<string> cstring; 
    cstring[0] = "foo"; 
    cout << cstring[0] << "\n"; // prints "foo" 

    MyClass<double> cdouble; 
    cdouble[0] = 3.14; // prints 3.14 
    cout << cdouble[0]; 

    return 0; 
}