2012-02-22 2 views
3

헤더에있는 상수에 따라 템플릿이 있습니다. 이런 식으로 뭔가 :템플릿에 사용되는 상수를 선언하는 방법은 무엇입니까?

  1. 상수를 정의하는 헤더 :

    // header1.hpp 
    const int CONST_VALUE1 = 10; 
    
  2. 내가 템플릿이 헤더 :

    // header2.hpp 
    extern const int CONST_VALUE2; 
    
    template< int N > 
    struct A 
    { 
    }; 
    struct B 
    { 
        // some member functions 
        A<CONST_VALUE2> a; 
    }; 
    
  3. B의 정의와 함께 소스를 상수

    // source2.hpp 
    #include "header2.hpp" 
    // implementation of B 
    const int CONST_VALUE2 = CONST_VALUE1; 
    

물론 이것은 작동하지 않습니다. 오류는 다음과 같습니다.

error: the value of 'CONST_VALUE2' is not usable in a constant expression 
note: 'CONST_VALUE2' was not initialized with a constant expression 
note: in template argument for type 'int' 

해결 방법이 있습니까? 아니면 header2.hpp에 header1.hpp를 포함시켜야합니까?

+0

CONST_VALUE2이 (가) extern이기 때문에 작동하지 않습니까? – vulkanino

+0

@vulkanino 예, 컴파일러가 말하는 것입니다. 해결 방법이 있습니까? –

+0

대답은 여기에 있습니다 : http://stackoverflow.com/questions/643763/what-are-the-requirements-for-c-template-parameters – vulkanino

답변

1

템플릿에는 유형이 아닌 매개 변수에 대한 상수 표현식이 필요합니다. const 변수를 상수 표현식에 사용하려면 해당 초기화가 컴파일러에 표시되어야합니다. 따라서 header2.hpp에 header1.hpp를 포함 시키려면 을 사용해야합니다.

+1

* 아마 *.내가 그럴 필요가 없다는 뜻인가? –

0

header1은 header2에 표시되어야합니다. 템플릿 화 된 클래스는 모든 정의가없는 한 자체 인스턴스화하는 방법을 알지 못합니다.

0

This answerextern const이 작동하지 않는다고 알려줍니다.

그러나, 나는 주위에 일을 생각 :

  1. 변화 상수 정의 할 header2.hpp :

    #include "header2.hpp" 
    // implementation of B 
    static_assert(CONST_VALUE2 == CONST_VALUE1, "check the constant!"); 
    
    : 상수를 확인하는

    const int CONST_VALUE2 = 10; 
    
  2. 변경 소스 파일을

이 방법으로 header2.hpp는 header1.hpp를 포함 할 필요가 없습니다 (소스 파일에만 필요합니다).

0

템플릿은 컴파일 될 때 평가되므로 모든 템플릿 인수는 그 시점에서 알려지고 일정해야합니다. 변수를 extern으로 선언하면 컴파일러는 템플릿을 평가할 때 값을 알지 못하므로보고있는 오류가 발생합니다.

템플릿을 컴파일 할 때 템플릿 인수가 알려진 값인지 확인해야합니다.

관련 문제