2011-02-06 7 views
0

안녕하세요 저는 C++로 템플릿을 배우므로 템플릿 클래스가 될 매트릭스 클래스를 작성하기로했습니다. Matrix.h 파일에서 나는C++ 템플릿 - 매트릭스 클래스

#include "StdAfx.h" 
#include "Matrix.h" 


Matrix::Matrix() 
{ 
} 



Matrix::~Matrix() 
{ 
} 

그러나 나는 오류를 얻을이 컴파일하려는 경우 기본 생성자에 대한 매트릭스 cpp에있는 비주얼 Stuio automaticlly 찾을 생성 된 코드를

#pragma once 
#include "stdafx.h" 
#include <vector> 



using namespace std; 

template<class T> 
class Matrix 
{ 
public: 

    Matrix(); 

    ~Matrix(); 
    GetDataVector(); 
    SetDataVector(vector<vector<T>> dataVector); 
    bool operator == (Matrix* matrix); 
    bool operator < (Matrix* matrix); 
    bool operator <= (Matrix* matrix); 
    bool operator > (Matrix* matrix); 
    bool operator >= (Matrix* matrix); 
    Matrix* operator + (Matrix* matrix); 
    Matrix* operator - (Matrix* matrix); 
    Matrix* operator * (Matrix* matrix); 

private: 
    vector<vector<T>> datavector; 
    int columns,rows; 


}; 

을 썼다

' Matrix ': 클래스 템플릿 사용 템플릿 인수 목록이 필요합니다. 오류는 기본 생성자의 Matrix.cpp 파일에 있습니다. 전자 문제 ??

+1

당신은'bool operator == (행렬 * 행렬); 대신'bool operator == (const 행렬 & 행렬) const; '를 원합니다. 또한'std :: vector'는 자체적으로 정리되기 때문에 소멸자가 필요 없습니다. – fredoverflow

+0

armadillo (http://arma.sourceforge.net/download.html)의 소스 코드를 볼 수도 있습니다. 출처는 분명하고 도서관은 훌륭합니다. 그건 그렇고 적극적으로 괜찮은 C++ 선형 대수 라이브러리를 유지 관리하는 것입니다. –

답변

4
당신은 같은 수준의 기능을 구현하여 쓰는해야합니다

: 당신은 컴파일 오류를 수정하는 경우에도 (hkaiser의 응답을 참조)

template <typename T> 
Matrix<T>::Matrix() {} 

template <typename T> 
Matrix<T>::~Matrix() { } 
+7

그런 다음 구현을 헤더에 넣으십시오. – robert

0

을, 당신이 때문에의, 링커 오류로 실행하겠습니다 템플릿 코드를 체계적으로 정리할 수 있습니다. 예를 들어 c++ class with templates compilation error을 참조하십시오.

+0

* .h 파일에 모든 코드를 삽입 한 후에는 괜찮습니다. – lastOfMohicans

1

템플릿 클래스 또는 메서드의 정의를 링커에서 링크하지 않으므로 (이론상 export은 있지만 컴파일러는 구현하지 않음) 템플릿 클래스 또는 메서드의 정의를 다른 파일에 넣을 수 없습니다. 당신은 템플릿 선언 후 다른 파일에 넣고 다음을 포함 할 수 있습니다 : 그것은이 포함되어있어 모든 파일로 전파 것이기 때문에

template<class T> 
class Matrix 
{ 
// (...) methods declarations here 
}; 

#include "matrix_implementation.hpp" 

또한, 헤더 파일 using namespace std; 지시어를 사용하지 마십시오.

+1

'extern '이 아니라'export'를 의미합니다. – Puppy

+0

@DeadMG : 예, 죄송합니다. 오타입니다. –

+0

구현 및 템플릿 인스턴스화를 .cpp 파일에 둘 수 있습니다. 행렬과 같은 클래스의 경우, 헤더에서 구현을 제거하면 .h를 포함하는 파일이 행렬 구현을 모두 (다시) 컴파일 할 필요가 없으므로 컴파일/링크 시간이 현저하게 단축 될 수 있습니다. 링커 기호가 누락되지 않도록하려면 .cpp (템플릿 클래스 Matrix ;)에서 템플릿을 명시 적으로 인스턴스화하십시오. 이 패턴은 종종 여러 구현을 공통 구현 T * -> void *로 축소하는 데에도 사용됩니다. – user48956

관련 문제