2015-06-08 3 views
-1

я пытаюсь сделать простой шаблон класса, но в dtor он дает ошибку компиляции: это то, что у меня есть:ошибка компиляции при использовании шаблона списка аргументов

#include <map> 

template<class k , class v> 
class ObjectMap 
{ 
    public: 
     ObjectMap(k key, v value) 
     { 
      InnerObjectMap = new std::map<key, value>(); 
     } 
     ~ObjectMap(); 
    private: 
     std::map<k,v> *InnerObjectMap; 
}; 

и вот файл CPP, который имеет только dtor

#include "ObjectMap.h" 
ObjectMap::~ObjectMap() 
{ 

} 

положить им получить ошибку компиляции:

1> ObjectMap.cpp 
1>\objectmap.cpp(6): error C2955: 'ObjectMap' : use of class template requires template argument list 
1>   \objectmap.h(10) : see declaration of 'ObjectMap' 
1>   \objectmap.h(10) : see declaration of 'ObjectMap' 
1>\objectmap.cpp(7): error C2509: '{dtor}' : member function not declared in 'ObjectMap' 
1>   \objectmap.h(10) : see declaration of 'ObjectMap' 
1>\objectmap.cpp(7): fatal error C1903: unable to recover from previous error(s); stopping compilation 

ВАЗе t im делать неправильно здесь?

+1

Вы пропустили 'template ' над определением и аргументы шаблона 'ObjectMap :: ~ ObjectMap()' – 101010

+0

Спасибо за ваш быстрый ответ – user63898

ответ

1

Ваш ObjectMap не просто класс. Это шаблон класса.

Оно должно быть:

#include <map> 

template <class k, class v> 
class ObjectMap 
{ 
    public: 
     ObjectMap(k key, v value) 
     { 
      InnerObjectMap = new std::map<key, value>(); 
     } 
     ~ObjectMap(); 
    private: 
     std::map<k,v> *InnerObjectMap; 
}; 

template <class k, class v> 
ObjectMap<k, v>::~ObjectMap() 
{ 
    // do stuff 
} 

Обратите внимание, что деструктор также в файле определения шаблона класса, а не * .cpp файл. В противном случае компилятор не сможет создать экземпляр вашего деструктора.

+0

Почему это? вы говорите, что я не могу установить деструктор в свой собственный файл cpp? – user63898

+0

@ user63898 Да. Когда компилятор создает экземпляр вашего деструктора в другом модуле, он не знает деструктора - он знает только '~ ObjectMap();', который находится в файле заголовка. – ikh

+1

@ user63898 это поможет вам в деталях. http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – Steephen

1
InnerObjectMap = new std::map<key, value>(); 

Над строкой кода следует переписать следующим образом, так как std::map декларация ожидает типа вместо значений;

InnerObjectMap = new std::map<k, v>(); 

Ваше определение деструктора должно измениться следующим образом, так как это шаблон:

template<class k , class v> 
ObjectMap<k,v>::~ObjectMap() 
{ 

} 

Вы можете увидеть более подробную информацию о том, почему вы должны реализовать шаблоны в файле заголовка из этой SO ссылка: Why can templates only be implemented in the header file?