使用模板参数列表时的编译错误

时间:2015-06-08 10:24:38

标签: c++ templates

我尝试制作简单的模板类,但在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

我在这里做错了什么?

2 个答案:

答案 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?