vector 构造二维矩阵出现 LNK2019: 无法解析的外部符号

unicornhx 2009-08-08 06:32:52
小弟想学习下模板和vector 就编写了如下 代码
但编译时出现

正在链接...
main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Matrix::~Matrix(void)" (??1?$Matrix@H@@QAE@XZ),该符号在函数 _main 中被引用
main.obj : error LNK2019: 无法解析的外部符号 "public: static void __cdecl Matrix::Display(class Matrix &)" (?Display@?$Matrix@H@@SAXAAV1@@Z),该符号在函数 _main 中被引用
main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Matrix::Matrix(int,int,int)" (??0?$Matrix@H@@QAE@HHH@Z),该符号在函数 _main 中被引用
d:\My Documents\Visual Studio 2008\Projects\MagicMatrix\Debug\MagicMatrix.exe : fatal error LNK1120: 3 个无法解析的外部命令

另外我是在vs2008 中使用 “空项目”创建的工程,添加类和Cpp文件 不知道这是不是根源
如果有其他错误还望 大家多多指正~~~ 谢谢各位了~

// Matrix.h
#if!defined _MATRIX_H
#define _MATRIX_H
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class Matrix
{
public:
Matrix(void);
~Matrix(void);
Matrix(int r,int c,T i); //给矩阵初始化,值全部设为 i
static void Display(Matrix<T> &M); //显示所有元素
private:
int row,col;
vector<vector<T> > matrix;//看到有人提示这里不能直接为">>",我在中间添加了空格
};
#endif



// Matrix.cpp
#include "Matrix.h"
template<typename T>
Matrix<T>::Matrix(void) // 1?我想默认初始化一个空的矩阵 不知道这样写对吗?
{row=0;
col=0;
matrix(row,vector<T> (col,0)); //2?初始化对任意类型 可以用0吗? 用NULL 行吗?
}
template<typename T>
Matrix<T>::~Matrix(void)
{}

template <typename T>
Matrix<T>::Matrix(int r,int c,T i):

row(r),col(c),
matrix(row,vector<T> (col,i))
{}
template <typename T>
void Matrix<T>::Display(Matrix<T> & M)
{
for(int i=0;i<M.row;i++)
for(int j=0;j<M.col;j++)
{cout<<M.[i][j];}
cout<<endl;
}



//主程序
#include "Matrix.h"
#include <iostream>
using namespace std;
void main()
{
Matrix<int> Mat= Matrix<int>(2,2,0); //3? 这样写有误吗? 有什么其他写法吗?
Matrix<int>::Display(Mat);
}
...全文
170 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
丈八涯 2009-08-10
模板也不是非要放到头文件里,不过我一直都是放到头文件里.:)

另外使用模板,却还要通过输入,这种结构让人不太理解,并且也比较危险.
回复
unicornhx 2009-08-09
=) 谢谢 恩 确实是要添加 cpp文件
不过好像不是重载“<<” 应该是二维数组下标 “[]”
看到网上有些重载方法是
需要 先写一个一维的类 重载[]
然后在继承一个二维的类 再重载一次[]
不知道大家还有什么好方法 请赐教~~

[Quote=引用 2 楼 currenttt 的回复:]
如果按照LZ的方法创建工程,需要在主程序中增加一句:
#include "Matrix.cpp"
但是这个时侯还有错误:
C/C++ code
template<typename T>void Matrix<T>::Display(Matrix<T>& M)
{for(int i=0;i<M.row;i++)for(int j=0;j<M.col;j++)
{cout<<M[i][j];}//问题在这里:对于类型T,需要重载运算符<< cout<<endl;
}
[/Quote]
回复
unicornhx 2009-08-09
没有问题啊 我以前还写了一个模板类vector 没有放在在一个文件里
只不过在.cpp 里的每个函数实现前面加上 template <typename T> 就可以运行了
[Quote=引用 1 楼 arong1234 的回复:]
模板类的实现和普通类不一样,必须都放在头文件里
你看看vector自己的实现就知道了
[/Quote]
回复
arong1234 2009-08-08
只要常用编译器不支持,就应该尽量避免使用
[Quote=引用 3 楼 haoshen1987 的回复:]
用模板时,类的定义与实现在不同文件的话,要用关键字export,但目前好像很少有编译器支持。
建议写在同一文件中试试。
[/Quote]
回复
hua_zhixing_ 2009-08-08
用模板时,类的定义与实现在不同文件的话,要用关键字export,但目前好像很少有编译器支持。
建议写在同一文件中试试。
回复
currenttt 2009-08-08
如果按照LZ的方法创建工程,需要在主程序中增加一句:
#include "Matrix.cpp"
但是这个时侯还有错误:

template <typename T>
void Matrix<T>::Display(Matrix<T> & M)
{
for(int i=0;i<M.row;i++)
for(int j=0;j<M.col;j++)
{cout<<M[i][j];} //问题在这里:对于类型T,需要重载运算符<<
cout<<endl;
}
回复
arong1234 2009-08-08
模板类的实现和普通类不一样,必须都放在头文件里
你看看vector自己的实现就知道了
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告