Ошибка при попытке перегрузки выходного оператора

Я изучаю C ++, и я сталкиваюсь с ошибкой компоновки при создании моего проекта.

Ошибка связана с моим кодом, который перегружает вывод << оператор.

Это ошибка, которую я получаю:

1>lab4.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Matrix<2,2> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Matrix@$01$01@@@Z) referenced in function _main
1>c:\users\matt\documents\visual studio 2010\Projects\lab4\Debug\lab4.exe : fatal error LNK1120: 1 unresolved externals

Как я могу исправить эту ошибку? Я приложил мой код ниже

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

template <int m, int n>
class Matrix{
public:
int data[m][n];
public:
Matrix(){};

void setup(){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
data[i][j] = 0;
}
}
}

void setAll(int integer){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
data[i][j] = integer;
}
}
}

void output(){
for(int i=0;i<m;i++){
cout << "[ ";
for(int j=0;j<n;j++){
cout << data[i][j] << " ";
}
cout<<"]"<<endl;
}
}

Matrix<m,n> operator+ (const Matrix<m,n> &rhs)
{
Matrix<m,n> result;

for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
result.data[i][j] = this->data[i][j] + rhs.data[i][j];
}
}

return result;
}

Matrix<m,n> operator- (const Matrix<m,n> &rhs)
{
Matrix<m,n> result;

for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
result.data[i][j] = this->data[i][j] - rhs.data[i][j];
}
}

return result;
}

template <int l>
Matrix <m,l> operator*(const Matrix<n,l> &rhs) //const
{
//only if number of columns in the first matrix equals the number of rows in the second matrix.
Matrix<m,l> result;
for(int i = 0; i < m; i++){
for(int j = 0 ; j < l ; j++){
result.data[i][j] = 0;
for(int k = 0; k < n; k++){
result.data[i][j] += this->data[i][k] * rhs.data[k][j];
}
}
}
return result;
};

Matrix <m,n> operator*(int scalar){
Matrix <m,n> result;
for(int i= 0; i < m; i++){
for(int j = 0; j < n; j++){
result.data[i][j] = this->data[i][j] * scalar;
}
}
return result;
};

friend ostream& operator<<(ostream &os, const Matrix<m,n> &rhs);
friend Matrix <m,n> operator++(const Matrix<m,n> &rhs, int);
friend Matrix <m,n> operator--(const Matrix<m,n> &rhs, int);
};

template <int m, int n>
ostream& operator<< (ostream &os, const Matrix<m,n> &rhs){
for(int i=0;i<m;i++){
os << "[ ";
for(int j=0;j<n;j++){
os << rhs.data[i][j] << " ";
}
os<<"]"<<endl;
}
return os;
}

template <int m, int n>
Matrix <m,n> operator++(const Matrix<m,n> &rhs, int){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
rhs.data[i][j]++;
}
}
}

template <int m, int n>
Matrix <m,n> operator--(const Matrix<m,n> &rhs, int){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
rhs.data[i][j]--;
}
}
}

int main(){
Matrix<2,2> m = Matrix<2,2>();
m.setup();
//m.output();

Matrix<2,2> p = Matrix<2,2>();
p.setup();

Matrix<2,2> z = Matrix<2,2>();
z = m + p;
//z.output();

z = z * z;
cout << z;
string stopper;
getline(cin, stopper);
}

2

Решение

Действительно ли весь ваш источник находится в одном файле, как показано здесь?
Знаете ли вы, что вы должны определить функции-члены класса шаблона в его заголовке? (на самом деле, это просто самое простое решение, есть несколько обходных путей)

Ref .: http://www.parashift.com/c++-faq/separate-template-fn-defn-from-decl.html

Если нет, то это может быть причиной ошибки.

Кстати, этот источник ошибочен:

template <int m, int n>
ostream& operator<< (ostream &os, const Matrix<m,n> &rhs){
for(int i=0;i<m;i++){
os << "[ ";
for(int j=0;j<n;j++){
os << data[i][j] << " ";
}
os<<"]"<<endl;
}
return os;
}

data здесь не объявлено, оно должно упоминаться как rhs.data, так как это operator<< не является членом класса matrix,

Upd.

Вы должны объявить все ваши функции друзей в классе как

template <int f_m, int f_n>
friend ostream& operator<<(ostream &os, const Matrix<f_m,f_n> &rhs);

Это отдельные шаблоны, их аргументы должны быть отдельными. Странно, что MSVC ++ не выдает эту ошибку. GCC говорит:

matrix.cc:91:67: warning: friend declaration «std::ostream& operator<<(std::ostream&, const Matrix<m, n>&)» declares a non-template function [-Wnon-template-friend]
matrix.cc:91:67: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]