当前位置:编程学习 > C/C++ >>

C++模板类的问题求指教

//代码

//main.cpp
#include <iostream>
using namespace std;

#include "AdjMatrixGraph.h"

void main()
{
 AdjMatrixGraph<int> a(5,DG);

 system("pause");
}

//AdjMatrixGraph.h
#define INFINITY 0xffffffffL   //表示有权图中的无穷大
typedef long AdjType;   //顶点关系类型。对无权图,用1或0表示是否相邻;
//对带权图,则用对应权值或INFINTY表示是否相邻
typedef enum{DG=1,UDG,DN,UDN} GraphKind;//{有向图,无向图,有向网,无向网}

template <class VRType>  //VRType是顶点的数据类型
class AdjMatrixGraph
{
private:
 int vexnum,arcnum;//顶点数,边数
 VRType *vexs;     //顶点向量
 AdjType **arcs;   //邻接矩阵
 GraphKind kind;   //图的类型
public:
 AdjMatrixGraph();
 AdjMatrixGraph(int,GraphKind);
 void CreateGraph();
 ~AdjMatrixGraph();
};

//AdjMatrixGraph.cpp
#include "AdjMatrixGraph.h"

template <class VRType>
AdjMatrixGraph<VRType>::AdjMatrixGraph()
{

}

template <class VRType>
AdjMatrixGraph<VRType>::AdjMatrixGraph(int VexNum,GraphKind Kind)
{
 vexnum = VexNum;
 vexs = new VRType[vexnum];//为顶点向量分配存储空间
 //为邻接矩阵分配存储空间同时初始化
 arcs = new AdjType*[vexnum];
 while(VexNum-->0)
 {
  *(arcs+VexNum) = new AdjType[vexnum];
  *(arcs+VexNum) = {0};
 }
}

template <class VRType>
AdjMatrixGraph<VRType>::~AdjMatrixGraph()
{
 delete[] vexs;
 while(vexnum-->0)   delete[] *(arcs+vexnum);
 delete[] arcs;

 

//main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall AdjMatrixGraph<int>::~AdjMatrixGraph<int>(void)" (??1?$AdjMatrixGraph@H@@QAE@XZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall AdjMatrixGraph<int>::AdjMatrixGraph<int>(int,enum GraphKind)" (??0?$AdjMatrixGraph@H@@QAE@HW4GraphKind@@@Z),该符号在函数 _main 中被引用
1>E:\Myprojects\VS2010\数据结构\Debug\图的基本实现.exe : fatal error LNK1120: 2 个无法解析的外部命令

答案:不知道这是楼主写的第一个模板程序还是怎么样。处理模板代码不能像处理非模板代码那样简单在.h文件声明然后在.cpp文件定义,具体机制比较复杂,本人不是很懂,可以参看c++ Template.要解决楼主的问题,可以有两种方法:
(1)将模板类的声明和实现都放在一个头文件里
(2)在使用模板类的.cpp文件里加上#include "AdjMatrixGraph.cpp"。
本人试过第二种方法,在main.cpp文件加上#include "AdjMatrixGraph.cpp" 结果是可行的。
有什么不正确的地方,欢迎指正。另外本人用的是vs2008编译器。

上一个:谁有Microsoft Visual C++ V6.0软件?
下一个:谁有C++免费的教程啊

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,