2013-04-15 5 views
0

템플릿 클래스 Grid를 만들었습니다 (여기서 헤더 파일에서 T는 기본값이 float입니다). 소스 파일의 일부를 인용했습니다.C++ 템플릿 클래스 데이터 멤버를 사용하여 "사용 가능한 적절한 기본 생성자가 없습니다."오류가 발생했습니다

#include"Grid.h" 

template <class T> 
Grid<T>::Grid(unsigned int rows=1, unsigned int columns=1) 
:Rows(rows),Columns(columns) 
{ 
reset(); 
} 

template<class T> 
Grid<T>::~Grid(){} 

template <class T> 
void Grid<T>::reset() 
{ 
vector<T> vec(Rows * Columns,T()); 
matrix = vec; 
} 

다른 멤버 함수는 행렬의 값을 읽거나 변경할 수 있습니다.

Grid.h : 내가 템플릿 클래스를 사용하기 위해 내가 Grid.cpp뿐만 아니라 Grid.h을, #include를하는 데 필요한 인터넷에 발견하고이 일을 내가 사용할 수 있습니다

template<typename T=float> class Grid{ 

public: 
     Grid(unsigned int, unsigned int); 
     ~Grid(); 
     T getValue(unsigned int, unsigned int); 
     void setValue(unsigned int, unsigned int, T); 
     void reset(); 
     void write(); 

private: 
     unsigned int Rows; 
     unsigned int Columns; 
     vector<T> matrix; 
}; 

clas Grid와 그 멤버 함수는 main()에 있습니다. 나는 또한 전 처리기 래퍼 arround Grid.cpp를 넣는다. 이제

, 내가 상속하지 않고, 새로운 클래스 PDEProblem을 구축하려고하지만 형 그리드에서 사용하는 회원이 내가 오류를 얻을 때 :

Error 2 error C2512: 'Grid<>' : no appropriate default constructor available  c:\users\... 15 

    Error 3 error C2512: 'Grid<T>' : no appropriate default constructor available c:\users\... 15 
4 IntelliSense: no default constructor exists for class "Grid<float>" c:\Users\... 15 

PDEProblem.h :

#include"grid.h" 
#include"grid.cpp" 

class PDEProblem: Grid<> 
{ 
public: 
PDEProblem(unsigned int,unsigned int); 
~PDEProblem(); 
//some more other data members 

private: 
Grid<char> gridFlags; 
Grid<> grid; 
unsigned int Rows; 
unsigned int Columns; 
void conPot(unsigned int, unsigned int); 
void conFlag(unsigned int, unsigned int); 
}; 

PDEProblem.cpp :

#include"grid.h" 
#include"grid.cpp" 
#include "PDEProblem.h" 

PDEProblem::PDEProblem(unsigned int rows=1,unsigned int columns=1) 
    :Rows(rows), Columns(columns) 
{ 
    conPot(rows, columns); 
    conFlag(rows,columns); 
} 

PDEProblem::~PDEProblem(){} 

void PDEProblem::conPot(unsigned int rows, unsigned int columns) 
{ 
    grid=Grid<>(rows,columns); 
} 

void PDEProblem::conFlag(unsigned int rows, unsigned int columns) 
{gridFlags=Grid<char>(rows,columns); 
    // some stuff with a few if and for loops which sets some elements of gridFlags to 1 and the others to 0 
} 

어떻게 해결할 수 있습니까? 내가 관련된 모든 것에 대한 불이행이 있다고 생각합니까?

+2

'templates '는 헤더 파일에 직접 메소드를 인라인하면 쉽게 사용할 수 있습니다. 먼저 해봐. 구현을 별도로 컴파일 된 소스 파일로 분리 할 수 ​​있지만 명시 적 인스턴스화가 필요합니다. – jxh

+0

@ user315052, 헤더 파일의 구현을 복사하여 붙이기 만하면됩니까? 가능하다면 대부분의 경우 두 개의 개별 파일을 사용하는 이유는 무엇입니까? – Wouter

+0

코드가 완전히 정상입니다. [라이브 코드] (http://liveworkspace.org/code/4ewMXt$1)'.h' 또는'.cpp' 파일을 포함하는 데 문제가 있습니다. – deepmax

답변

1

내 컴파일러 (Visual Studio 2010)와 코드를 사용하면 함수 정의에서 함수 프로토 타입으로 기본 매개 변수 값을 이동하여 오류를 해결할 수 있습니다. 특히 :

Grid.h

template<typename T=float> class Grid{ 

public: 
    Grid(unsigned int rows = 1, unsigned int columns = 1); 
... 
}; 

Grid.cpp

template <class T> 
Grid<T>::Grid(unsigned int rows, unsigned int columns) 
:Rows(rows),Columns(columns) 
{ 
reset(); 
} 
+0

고맙습니다. 문제가 해결되었습니다 (Visual Studio Express 2012) – Wouter

0

귀하의 문제는 메인 클래스가 그리드에서 상속과 동시에 그리드의 다른 두 인스턴스를 포함한다는 것이다. 나쁜 디자인을 제외하고 두 Grid 인스턴스에 대한 명시 적 생성자가 없으므로 오류가 발생합니다. 기본값을 사용하는 것은 적절한 방법이 아닙니다.