2010-01-27 2 views
0

이 C++ typelist 템플릿 컴파일 오류를 수정하려면 어떻게해야합니까?

typelist.hpp (현대 C의 ++ 디자인 3 장을 읽기에서) :

class NullType {}; 

struct EmptyType {}; 


template <class T, class U> 
struct Typelist 
{ 
    typedef T Head; 
    typedef U Tail; 
}; 

#define TYPELIST_1(T1) Typelist<T1, NullType> 
#define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2) > 
#define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3) > 
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, TYPELIST_3(T2, T3, T4) > 
#define TYPELIST_5(T1, T2, T3, T4, T5) Typelist<T1, TYPELIST_4(T2, T3, T4, T5) > 
#define TYPELIST_6(T1, T2, T3, T4, T5, T6) Typelist<T1, TYPELIST_5(T2, T3, T4, T5, T6) > 


namespace TL 
{ 
    template <class TList> struct Length; 
    template <> struct Length<NullType> 
    { 
    enum { value = 0 }; 
    }; 

    template <class T, class U> 
    struct Length< Typelist<T, U> > 
    { 
     enum { value = 1 + Length<U>::value }; 
    }; 


    template <class Head, class Tail> 
    struct TypeAt<Typelist<Head, Tail>, 0> 
    { 
     typedef Head Result; 
    }; 

    template <class Head, class Tail, unsigned int i> 
    struct TypeAt<Typelist<Head, Tail>, i> 
    { 
     typedef typename TypeAt<Tail, i-1>::Result Result; 
    }; 

} 

MAIN.CPP

#include "typelist.hpp" 

Typelist<int, double> foo; 

int main() { 
} 

그램 ++ MAIN.CPP

typelist.hpp:37: error: ‘TypeAt’ is not a template 
typelist.hpp:43: error: type/value mismatch at argument 2 in template parameter list for ‘template<class Head, class Tail> struct TL::TypeAt’ 
typelist.hpp:43: error: expected a type, got ‘i’ 

이 왜를 이 오류가 발생합니까? 이 문제를 어떻게 해결할 수 있습니까?

답변

3

이 보이는

당신이 작성해야, foo는 정의합니다.

이는 부분 특수화입니다 :

template <class Head, class Tail> 
struct TypeAt<Typelist<Head, Tail>, 0> 

그러나 컴파일러는의 전문화 무엇 아무 생각이 없습니다. 그 전에이 추가 :

template <class List, unsigned Index> 
struct TypeAt; 

이하자가 컴파일러 알고있다 : "두 개의 템플릿 매개 변수가있는 클래스 TypeAt이 있습니다." 그래서 지금 당신이 그것을 전문화 할 때, 컴파일러는 여러분이 말하는 클래스를 알고 있습니다.


참고로 Typelist의 사용이 잘못되었습니다. 이 알고리듬은 입니다 (센티널 종료). 이것은 C- 문자열과 마찬가지로 데이터가 특별한 값으로 결론 지을 것을 기대합니다. 여기서는 NullType입니다.

따라서 Éric 님의 조언을 청하십시오. (예 : 힌트 : 도움이 될만한 답변을 찾은 경우 위로 투표하십시오.)

+1

+1 : 30 초가 너무 늦었습니다. –

1

유형 목록은 재귀 적으로 사용하도록 설계되었습니다. 두 번째 templater 매개 변수가 다른 유형 목록 또는 NullType (재귀의 끝을 알리는 신호)이 될 것으로 예상합니다. 당신이 매크로를 피하려면,

TYPELIST_2(int, double) foo; 

또는 : 당신은 앞으로 선언을 놓치고처럼

Typelist<int, Typelist<double, NullType> > foo; 
+1

이것은 문제가 아니며 문제가되지 않습니다. – GManNickG

+0

@GMan : 질문에보고 된 컴파일러 오류를 다시 읽는 중, 나는 이것이 * 문제가 아니라는 데 동의합니다. 그러나 문제는 TL :: Lenght 또는 TL :: TypeAt는 질문에 정의 된대로 유형 목록에 사용할 수 없습니다. –

+0

@ Eric : 문제가되는 것이 옳습니다. 저의 실수입니다. :) – GManNickG

관련 문제