2015-05-19 75 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

我的水晶球(因为没有发布错误)说这个模板是在与main()分开的cpp文件中实现的。 – 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>); 

Heretemplate friend operators提供有关使用模板的朋友很好的说明的链接。

编辑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

答案在技术上是正确的,upvoted,但不是'operator <<'作为模板(顺便说一句,你需要从'T'改变名称),你可以在类中提供定义,而不需要'template ',就像'ostream&operator <<(ostream&out,matrix arg){/ * here here * /}'。由于ADL,您的功能将可见。 – vsoftco

+0

@vsoftco感谢您的建议。我编辑了我的帖子,但我也在学习,以免万一我犯了一个错误,请告诉我。 ☺ – sam

+0

如果您有兴趣为什么要声明朋友内联工作以及ADL如何找到它:http://stackoverflow.com/questions/23721731/name-which-introduced-by-friend-declaration – vsoftco

相关问题