2015-05-19 8 views
0

Почему я получаю ошибки компоновщика при попытке скомпилировать этот код, это в основном код матрицы матриц шаблона, который является сложным. &. Матрица является квадратной матрицей, поэтому, если в нее введен размер «3» означает матрицу из [3] [3], но почему-то это дает мне ошибки, любую помощь?Ошибки компоновщика C++, неразрешенные внешние ссылки

#include <iostream> 
#include <iomanip> 
using namespace std; 

template <class T> 
class matrix 
{ 
private: 
    T** real; 
    T** imag; 
int size; 
public: 
    matrix(int = 0); 
    friend ostream& operator<<(ostream& out, matrix<T>); 
}; 

// constructor 

template <class T> 
matrix<T>::matrix(int length) 
{ 
size = length; 

real = new T*[size]; 
for (int i = 0; i < size; i++) 
    real[i] = new T[size]; 

imag = new T*[size]; 
for (int i = 0; i < size; i++) 
    imag[i] = new T[size]; 

cout << "Enter real elements of matrix: "; 
for (int i = 0; i < size; i++) 
    for (int j = 0; j < size; j++) 
     cin >> real[i][j]; 

cout << "Enter imag elements of matrix: "; 
for (int i = 0; i < size; i++) 
    for (int j = 0; j < size; j++) 
     cin >> imag[i][j]; 
} 

// functions defined here 

template <class T> 
ostream& operator<<(ostream& out, matrix<T> arg) 
{ 
out << showpos; 
for (int i = 0; i < arg.size; i++) 
    for (int j = 0; j < arg.size; j++) 
     out << arg.real[i][j] << arg.imag[i][j] << " "; 
out << endl; 
return out; 
} 

int main() 
{ 
    matrix <int> obj1(3); 
    cout << obj1; 
} 
+3

Вы планировали опубликовать ошибки? –

+1

Мой хрустальный шар (так как ошибок не было опубликовано) говорит, что шаблон был реализован в файле cpp отдельно от main(). – drescherjm

ответ

0

Спасибо всем за помощь. похоже, что мне нужен шаблон, потому что это была функция, не являющаяся членом матрицы классов, а следующий правильный код. Извините, если я сделал что-то неправильно во время публикации этого вопроса, потому что на самом деле это первый раз, когда я использую переполнение стека.

#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
using namespace std; 

// Class ! 

template <class T> class matrix 
{ 
private: 
    T** real; 
    T** imag; 
    int size; 
public: 
    matrix(int = 0); 
    matrix(int,int); 
template <class T> friend ostream& operator<< <T>(ostream& out, matrix<T>); 
matrix operator+(matrix); 
matrix operator-(matrix); 
}; 

// Constructor ! 

template <class T> matrix<T>::matrix(int lenght, int dummy) 
{ 
size = lenght; 

real = new T*[size]; 
for (int i = 0; i < size; i++) 
    real[i] = new T[size]; 

imag = new T*[size]; 
for (int i = 0; i < size; i++) 
    imag[i] = new T[size]; 
} 

template <class T> matrix<T>::matrix(int length) 
{ 
size = length; 

real = new T*[size]; 
for (int i = 0; i < size; i++) 
    real[i] = new T[size]; 

imag = new T*[size]; 
for (int i = 0; i < size; i++) 
    imag[i] = new T[size]; 

cout << "Enter real elements of matrix >> \n"; 
for (int i = 0; i < size; i++) 
    for (int j = 0; j < size; j++) 
     cin >> real[i][j]; 

cout << "Enter imag elements of matrix: >> \n"; 
for (int i = 0; i < size; i++) 
    for (int j = 0; j < size; j++) 
     cin >> imag[i][j]; 
} 

// Main() 


int main() 
{ 
int size; 
cout << "Enter Size: "; 
cin >> size; 

cout << "\nMatrix A created !" << endl; 
matrix <int> A(size); 

cout << "\nMatrix B created !" << endl; 
matrix <int> B(size); 
system("cls"); 

cout << "Matrix A" << endl; 
cout << A; 

cout << "\nMatrix B" << endl; 
cout << B; 

cout << "\nMatrix A + B" << endl; 
cout << A + B; 

cout << "\nMatrix A - B" << endl; 
cout << A - B; 
} 

// Functions ! 

template <class T> ostream& operator<<(ostream& out, matrix<T> arg) 
{ 
out << showpos; 
for (int i = 0; i < arg.size; i++) 
{ 
    for (int j = 0; j < arg.size; j++) 
    { 
     out << arg.real[i][j] << arg.imag[i][j] << "i "; 
    } 
     out << endl; 
} 
return out; 
} 

template <class T> matrix<T> matrix<T>::operator+(matrix arg) 
{ 
matrix<T> temp(size,0); // 0 is a inserted as dummy because I've overloaded    
constructor of class 

for (int i = 0; i < size; i++) 
{ 
    for (int j = 0; j < size; j++) 
    { 
     temp.real[i][j] = real[i][j] + arg.real[i][j]; 
     temp.imag[i][j] = imag[i][j] + arg.imag[i][j]; 
    } 
} 
return temp; 
} 

template <class T> matrix<T> matrix<T>::operator-(matrix arg) 
{ 
matrix<T> temp(size, 0); // 0 is a inserted as dummy because I've overloaded 
constructor of class 

for (int i = 0; i < size; i++) 
{ 
    for (int j = 0; j < size; j++) 
    { 
     temp.real[i][j] = real[i][j] - arg.real[i][j]; 
     temp.imag[i][j] = imag[i][j] - arg.imag[i][j]; 
    } 
} 
return temp; 
} 
1

Поскольку компилятор ожидал функции без шаблона.

friend ostream& operator<<(ostream& out, matrix<T>); 

Однако вы определили, как

template <class T> 
ostream& operator<<(ostream& out, matrix<T> arg) 
{ 
    //some code 
} 

Внести изменения в определении класса, как

template<class N> friend ostream& operator<<(ostream& out, matrix<T>); 

Here найти ссылку на template friend operators, который обеспечивает хорошее объяснение об использовании шаблона друзей.

EDIT 1:

на основе предложения по vsoftco, вы можете также использовать альтернативный способ определить в классе:

class matrix{ 
//some code 

//we don't need template here 
friend ostream& operator<<(ostream& out, matrix<T>) 
{ 
    out << showpos; 
    for (int i = 0; i < arg.size; i++) 
     for (int j = 0; j < arg.size; j++) 
      out << arg.real[i][j] << arg.imag[i][j] << " "; 
     out << endl; 
    return out; 
} 
}; 
+0

Ответ технически корректен, но вместо 'operator <<' в качестве шаблона (btw вам нужно будет изменить имя из 'T'), вы можете предоставить определение внутри класса, без необходимости использовать шаблон ', как' ostream & operator << (ostream & out, matrix arg) {/ * реализация здесь * /} '. Затем ваша функция будет видна из-за ADL. – vsoftco

+0

@vsoftco благодарит за предложение. Я отредактировал свой пост, но я тоже учусь на случай, если я допустил ошибку, сообщите мне. ☺ – sam

+0

В случае, если вам интересно, почему объявление знакомого встроенного работает и как ADL находит его: http://stackoverflow.com/questions/23721731/name-which-introduced-by-friend-declaration – vsoftco