2010-09-20 44 views
0

我创建了一个包含地图的模板。 当我尝试创建该模板的一个实例时,我遇到了构造函数和析构函数的链接问题。 另外,当我尝试在主体中创建一个实例时,它会在调试时跳过该行,甚至不会在本地列表中显示它。 它不会编译“DataBase db”除非我在db之后加上“()”。 (这是我尝试主要启动实例的方式)。使用类模板的问题

的代码:

H:

template <class keyVal,class searchVal, class T> 
class DataBase 
{ 
private: 
    map<keyVal,pair<searchVal,T*>*> DB; 
public : 
    DataBase(); 
    virtual ~DataBase();  
}; 

CPP:

#include "DataBase.h" 

template <class keyVal,class searchVal, class T> 
DataBase<keyVal,searchVal,T>::DataBase() 
{} 

template <class keyVal,class searchVal, class T> 
DataBase<keyVal,searchVal,T>::~DataBase() 
{} 

感谢

+0

在您的问题中包括错误将允许更准确的响应。 – 2010-09-20 14:14:47

+0

相关:另请阅读[this](http://stackoverflow.com/questions/3749099/why-should-the-implementation-and-the-declaration-of-a-template-class-be-in-the-s/3749115#3749115)回答。 – 2010-09-20 14:15:34

+1

不要编写'Database db();'来创建一个数据库。它不这样做,但是声明一个返回一个的函数。 – 2010-09-20 14:17:33

回答

5

添加模板类(和功能)的执行直接在头文件:

template <class keyVal,class searchVal, class T> 
class DataBase 
{ 
private: 
    map<keyVal,pair<searchVal,T*>*> DB; 
public : 
    DataBase() {}; 
    virtual ~DataBase() {};  
}; 
+2

说明:http://www.parashift.com/c++-faq/templates.html#faq-35.12 – mkb 2010-09-20 14:15:28

+0

Nit-pick:在函数定义之后不应该有分号:-)。值得注意的是,这要求内联函数,它们也可以在类的下面定义以避免这种情况,并且有些人实际上包含头文件中的cpp文件以允许使用非模板代码更加统一样式(尽管这不是特别常见,我不推荐它)。 – 2010-09-20 16:13:17