我尝试制作简单的模板类,但在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;
};
这里是只有dtor的cpp文件
#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
我在这里做错了什么?
答案 0 :(得分: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文件中。否则,编译器将无法实例化析构函数。
答案 1 :(得分: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?