2011-09-22 4 views
1

템플릿 변수가 const 변수로만 초기화 될 수있는 이유를 알지 못합니다. 로, 왜 다음과 같은 코드가 작동하지 : 나는 주요, 모든 일에 희미한의 정의에 const를 추가하는 경우C++, 템플릿에 대한 비 매개 변수 유형 : const 변수 만?

#include <iostream> 
template <class T,int dim> 
class Vec 
{ 
    T _vec[dim]; 
    int _dim; 
    public: 
    Vec() : _dim(dim) {}; 
    ~Vec() {}; 
    // other operators and stuff 
}; 
int main() { 
    int dim = 3; 
    Vec < int, dim> vecInt3; 
} 

이 괜찮습니다. 왜 그런가요?

답변

3

정수 유형 매개 변수는 컴파일시 상수 여야합니다. 정수 리터럴을 사용하거나 변수를 const으로 만들어야합니다. 그 이유는 템플릿이 런타임 전에 인스턴스화되기 때문이며 나중에 변수 이름을 변경할 수있는 경우 프로그램은 템플릿과 일치하지 않게 작동합니다.

0

길이가 변수 인 테이블을 T _vec[dim]에 만들 수 없기 때문에 생각합니다. 대신 내장형 벡터 유형을 생각하지 않으시겠습니까?

+0

문제가 없으므로 ('template '에서'dim'가 더 이상 필요하지 않음), 이유를 설명하지 않습니다. – MSalters

0

첫째, 템플릿은 당신이 CONST 값을 사용해야하는 이유입니다 컴파일 시간에 내장되어 있습니다 : 그것은 런타임에 계산 될 수 없다. 실제로 코드를 컴파일 할 때 클래스는 각기 다른 매개 변수를 사용하기 위해 한 번 컴파일됩니다.

이렇게하면 다른 구문 오류가없는 경우 코드가 작동합니다.

미쳐 가기 전에 중요한 메모 : 헤더/cpp 파일의 템플릿을 분리 할 수 ​​없으므로 같은 파일에 헤더와 구현을 작성해야합니다!

0

템플릿 매개 변수는 컴파일 타임에 계산되어야하기 때문에. 컴파일러는 다른 매개 변수에 대한 코드를 작성합니다.

dim이 const가 아닌 경우 컴파일러는 vecInt3에 할당 할 공간의 크기를 알 수 없습니다. 사실 Vec<int, 1>Vec<int, 2>은 다른 유형입니다.

동적 크기의 벡터를 원한다면 std::vector을 참조하십시오.