求高手帮帮小弟,这个程序错在哪里了?(关于c++的模板类和运算符重载)

#include<iostream.h>
#include<iomanip>

template <typename Type>
class Matrix;

// 三元组顺序表,存储矩阵中非零元的行、列和非零值。
template <typename Type>
class Triple
{
public:
friend class Matrix<Type>;
Triple( Type item = Type(0),int i=0, int j=0)
{
m_ni = i;
m_nj = j;
m_data = item;
}
private:
int m_ni;
int m_nj;
Type m_data;
};

const int MAXSIZE = 100;
const int ZERO =0;

template <typename Type>
class Matrix
{
public:
Matrix(int row , int col , int tu);
Matrix(){}
Matrix<Type> Transpose(); // 转置

template <typename Type>
friend Matrix<Type> operator + (const Matrix<Type> &M, const Matrix<Type> &T); // 两个同型矩阵相加

template <typename Type>
friend ostream & operator << (ostream &out, const Matrix<Type> &M); // 输出对象

template <typename Type>
friend istream & operator >> (istream &in, const Matrix<Type> &M); // 输入对象

private:
int m_nrow; // 矩阵的行数
int m_ncol; // 矩阵的列数
int m_ntotal; // 矩阵的非零元个数
Triple<Type> data[MAXSIZE];
};

template <typename Type>
Matrix<Type>::Matrix(int row, int col, int tu)
{
int x;
int y;
m_nrow = row;
m_ncol = col;
m_ntotal = tu;
cout<<"请按行序依次输入各非零元的值和行列坐标:"<<endl;
for (int i=0; i<tu; i++)
{
cout<<"第"<<i+1<<"个非零元:"<<endl;
cout<<"行号:";
cin>>y;
while (y<1 || y>row)
{
cout<<"所输入的值不合法,请重新输入!"<<endl;
cin>>y;
}
data[i].m_ni = y;

cout<<"列号:";
cin>>x;
while (x<1 || x>col)
{
cout<<"所输入的值不合法,请重新输入!"<<endl;
cin>>x;
}
data[i].m_nj = x;
cout<<"非零元的值:";
cin>>data[i].m_data;
}
cout<<"稀疏矩阵已经输入完毕!"<<endl;
}

template <typename Type>
Matrix<Type> Matrix<Type>::Transpose()
{
Matrix<Type> T;
T.m_ncol = this->m_nrow;
T.m_nrow = this->m_ncol;
T.m_ntotal = this->m_ntotal;
if (T.m_ntotal!=0)
{
int q=0;
int c;
int t;
for (c=1; c<=m_ncol; c++)
{
for ( t=0; t<m_ntotal; t++ )
if (data[t].m_nj == c)
{
T.data[q].m_ni = data[t].m_nj;
T.data[q].m_nj = data[t].m_ni;
T.data[q].m_data = data[t].m_data;
++q;
}
}
}
return T;
}

template <typename Type>
ostream & operator << (ostream &out, const Matrix<Type> &M)
{
int q=0;
int i;
int j;
for (i=1; i<=M.m_nrow; i++)
{
for (j=1; j<=M.m_ncol; j++)
{
if ((M.data[q].m_ni==i) && (M.data[q].m_nj == j))
{
cout<<setw(5)<<M.data[q].m_data;
q++;
}
else
cout<<setw(5)<<ZERO;
}
cout<<endl;
}
cout<<endl<<endl;
return out;
}
还有一部分代码

嗯。。。这个问题我简单说一下:
1:你有可能用的是VC6.0这款比较古董的编译器。它不支持模板定义和实现分离,所以如果是这种情况的话,方案有两个:
a: 换一个高版本的编译器,如VS 2005
b: 如果不换的话,那么将定义和实现都放在类声明里边;就是说都在类体内实现,不要写成一个 *.h 和 *.cpp

2:你写的友元函数,有可能出现一类问题,说是有什么符号找不到? 嗯。这个估计也和VC 6.0 有关系,处理方式一样,也写在类体内。。。

然后在试试,不行的话代码都贴出来,帮你看看。。。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-28
写模版类吗?可以把能编译的代码都贴出来
第2个回答  2010-10-28
建议将文件保存在桌面上,试试,我试了没有问题。不知道原因

c++模板类问题
你好,看了你的代码!你这是定义了个模板类Complex; 其内部有一个成员函数为:运算符重载函数。其函数体定义在类的外部,从函数来看应该是(实部+虚部)。错在第12行,成员函数(模板函数)的外部定义。改为 template<class type> \/\/ 就是这里错误。Complex<class type>改为 template<class type>...

C++模板类的问题,这段程序哪里错了,要怎么改
template<template <typename T> class Thing> class Crab { private:Thing<int> s1;Thing<double> s2;public:Crab(){}; \/\/没有实现代码~,可以加个大括号表示什么都不做,或者去掉这行 bool push(int a,double x){ return s1.push(a) && s2.push(x);} bool pop(int &a,double &x...

C++,大佬们看下这里报错是为什么?可是这代码能AC啊?!
这两行主要是用在线段树上,因为 C++ 往往不使用类来实现线段树,而是通过数组来模拟实现。在线段树当中,如果某一个节点的 id 是 u,那么它的左孩子是 2 x u,右孩子的 id 是 2 x u + 1,用位运算来表示就是 u << 1 和 u << 1 | 1。define MEM(a,x) memset(a,x,sizeof a)#d...

请问这个C++程序需要怎么修改 出错的地方我是想用函数重载
先占位置,在帮你看吧 下面的这个函数参数的ez改为e,写错了吧 int arrayfind(T* a, int n,T ez,int (*fcmp)(const int,const int))\/\/查找 { int i;for(i=0;i<n; i++)if(fcmp(a[i], e) == 0)return i;return -1;}template <class T > 另外,你写的两个查找的模板还...

C++利用函数模版重载实现两个数组求个和,求大神告知为什么错了,还有怎 ...
看来你没有懂函数模板,函数模板中,T的类型实参必须是相同的,你的第二个函数名模板,你给T带进来的类型实参是int和double,就错了哦,你可以使用template <class T,class B> T(T *a,int n,B* a,int n) 这样就解决你需要的问题了

C++ 模板 重载 操作符 求助
建议你写个函数得了,比加号操作符要直观明了。《Effective C++》里说过,如果运算符重载不能让程序更容易读明白,那就不要用。template<class T> Node<T> * Advance (Node<T> * p, int step){ for(int i = 0; i < step; i++){ p = p->next;} return p;} 这不挺好的吗?

C++重载运算符。 太TM难了。 进来看看
除了参数多一个和少一个之外没什么区别。模板,一般来讲比较重要,因为用模板写的程序基本不上用考虑这个数据是什么类型(int, float, char等)。STL也可以看看,这个比较容易。若还有不明白就百度搜索《C++操作符重载专题》和《C++模板专题》应该对你有帮助。

[c++]bigint的运算符重载
你这错的真是离谱啊.我用模板描述的操作符重载的返回类型,还有,你对操作符重载的概念真的是很混乱,建议你多读几个操作符重载的程序再写吧 include <iostream> include <string> include <vector> using namespace std;template<class T> class bigint { public:friend T operator+(bigint&,bigint...

c++程序出错了,哪位大神帮帮我
说明在提到的头文件stl_iterator_base_types.h当中还有一个也叫point的类 把你的类改个名字吧 比如改成Point 那么就是 include<iostream>#include<math.h>using namespace std;class Point{private: int x; int y;public: Point(int a,int b) { x=a; y=b; } frie...

c++选择题,求大神详解
} T是模板,代表任意类型,也就是说可以是自定义类型也可以是int,char等基本类型。因为这个类重载了 "+" 加号运算符,所以可以认定 "+" 前面的类型是对象,后面的是参数。也就是说C选项的错误是没有重载这种 "+" 运算符,可能你还理解不了。这样B选项可以这么写你就明白了 b1.operator+(3) ...

相似回答
大家正在搜