2015-03-02 4 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; 
} 
Смежные вопросы