2012-02-13 3 views
3

나는 다음과 같은 템플릿이 있습니다템플릿 및 CONST ++

#include <iostream> 
template <class T,T defaultVal, int dim=255> 
class Vec 
{ 
    T _vec[dim]; 
    int _dim; 
public: 
    Vec() : _dim(dim) 
    { 
     for (int i=0;i<_dim;++i) 
     { 
      _vec[i] = defaultVal; 
     } 
    } 
    ~Vec() {}; 
    // other operators and stuff 
}; 
int main() 
{ 
    int defValue = 0; 
    Vec < int,defValue > vecWithDefVal; 
} 

그러나 템플릿 값이 CONST 또는 const를 리터럴 의미, 컴파일 시간 동안 알려진해야하기 때문에 프로그램이 컴파일되지 않습니다.

나는 정말로이 오류를 이해하지 못한다. 누구나 나에게 설명 할 수 있을까?

+0

좋아하는 C++ 책에서 "상수 표현"을 찾아보십시오. – sellibitze

답변

4

템플릿 클래스는 시간 컴파일 에서 만든, 그래서 값은 컴파일 타임에 알려진되어야한다. const이 아니라면 런타임까지 알 수 없으므로 컴파일러는 템플릿 클래스를 만들 수 없습니다.

+0

4? (자기 자신을 컴파일하지 못해 죄송합니다. 지금 내 PC가 아닙니다.) – Itzik984

+0

예, 상수 표현입니다. (링크 된 페이지 "리터럴"을 확인하십시오.) –

+0

예 : template 는 T와 int가 호환 가능하다면 (또는 T가 int를 취하는 생성자가있다) –

1

컴파일러에서 말한 것처럼 상수 표현식이어야합니다.

사용 const int defValue = 0;

+0

하지만 설명은 무엇입니까? – Itzik984

+0

const가없는 경우,'defValue'는 상수 표현이 아닙니다. 지금 : http://msdn.microsoft.com/en-us/library/3ffb821x.aspx 누군가 당신에게 관련 C++ 표준 문단을 파지 때까지. –

+0

@ itzik984 : 템플릿은 런타임 인 ​​C# Generics와 달리 컴파일 시간입니다. 따라서 컴파일 타임에 평가할 수있는 모든 것이 필요합니다. – Aamir

0
const int defValue = 0; 
Vec<int, defValue> vecWithDefVal; 
1

일반적으로 사용하려는 각 값에 대해 다른 유형을 사용하면 그다지 유용하지 않습니다. 대부분의 경우 생성자 매개 변수를 사용하여 객체의 기본값을 무시할 가능성이 있으므로 T()을 기본값 (아니요, 중복 된 "기본값"은 유형이 아닙니다)으로 사용하려고합니다. 런타임에 값을 판별하려면 기본에 대해 템플리트 인수를 사용하면 작동하지 않습니다.

실제로 질문의 코드는 템플릿 인수로 기본값을 사용하는 것이 문제가되는 이유를 보여줍니다. 상수 식만 인수로 사용할 수 있습니다. 즉, 컴파일 타임에 컴파일러가 알아낼 수있는 인수 만 실행 가능합니다. 또한,이 명확뿐만 아니라 일정한 것으로 표시 할 필요가 :

int const defValue = 0; 

당신이 포인터 또는 네임 스페이스 범위의 개체에 대한 참조를 사용하여 고려할 수 정수가 아닌 유형에 대처하기 위해. 그러나, 나는 constructor 매개 변수를 사용하는 것이 실제로 여기에 필요한 것이라고 생각한다.