Jag har definierat en operator+ för en matrisklass som jag har skrivit, men kompilatorn klagar när jag försöker använda operatorn. Vad gör jag för fel?
my:~/cprog06/lab1ex12>g++ -Wall -o test matrix_test.cpp matrix.cpp ../lab14/vector.cpp
matrix_test.cpp: In function 'int main()':
matrix_test.cpp:41: error: no matching function for call to 'Matrix::Matrix(Matrix)'
matrix.h:16: note: candidates are: Matrix::Matrix(Matrix&)
operator+ tar ju en referens, så varför i hela friden vill kompilatorn ha en konstruktor, och dessutom prompt en copykonstruktor som tar ett objekt, och inte en referens?
Arvid
Senast redigerad av arvidb 9 november 2006, 13:42:19, redigerad totalt 1 gång.
#include <iostream>
using namespace std;
class test {
friend ostream &operator<<(ostream &o, const test &t);
private:
int var;
public:
test(int val);
int operator+(const test &b);
};
test::test(int val) {
var = val;
}
int test::operator+(const test &b) {
return var+b.var;
}
ostream &operator<<(ostream &o, const test &t) {
cout << t.var;
return o;
}
int main() {
test a(3), b(2);
cout << a+b;
}
Matrix Matrix::operator+(const Matrix &ref) const
{
if ((m_ != ref.m_) || (n_ != ref.n_))
throw "Matrix::operator+(const Matrix &): Matrix dimensions must be equal.";
Matrix temp(m_, n_); <--- Här vill den ha konstructorn
for (int i = 0; i < m_; ++i)
for (int j = 0; j < n_; ++j)
temp[i][j] = (*row[i])[j] + ref[i][j];
return (temp); <--- här copy-konstructorn
simon78: Deklarerar jag copy-konstructorn explicit så får jag kompileringsfel även där du visar, ja. (Observera att det finns en copy-konstruktor i klassen Matrix.)
Kolla på felet igen - kompilatorn vill ha en Matrix::Matrix(Matrix) (d.v.s. en som tar Matrix istf Matrix-referens som parameter).
Matrix::Matrix(int m, int n) : m_(m), n_(n)
{
row = new Vector *[m_];
for (int i = 0; i < m_; ++i)
row[i] = new Vector(n_);
}
Matrix::Matrix(Matrix &ref) : m_(ref.m_), n_(ref.n_)
{
row = new Vector *[m_];
for (int i = 0; i < m_; ++i)
row[i] = new Vector(n_);
}
Copy-konstruktorn Matrix(Matrix &ref); är väl standard? Men eftersom jag har deklarerat den så implementerar jag den ju såklart också.
// Här , du deklarerar och initierar en enkel objekt m1 av klassen Matrix .
Matrix m1(5,5)
// och här betraktar du denna objektet m1 som en array av klassen Matrix
m1[j] = i*m1.getcols() + j;
Du skapar en en enda Matrix objekt , men du försöker initiera inte mindre
än 25 matrix objekter när loopet har kört färdigt . Var kommer ifrån alla
andra 24 Matrix objekter ? .
Dessutom är resultatet av uttrycket "i*m1.getcols() + j;" av typen int, och Matrix har ingen implicit konstruktor som tar en int som parameter - det går alltså inte att initiera en Matrix på det sättet.
Inget fel där alltså, så vitt jag kan se. En utskrift av m1 eller m2 visar också att det fungerar som avsett, nämligen att matrisens element tilldelas.