2015-03-02 34 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; 
}