2010-11-27 1 views
0

해당 템플릿의 매개 변수가 이전 템플릿 매개 변수의 하위 유형 인 유형의 비 유형 값인 템플릿 템플릿 매개 변수를 전달하려고합니다 (예 : 읽는 것처럼 말하기가 어렵습니다!), 그리고 단일 매개 변수화 된 템플릿으로 결과에 합류하려고 시도한 후에 빌드 오류가 발생합니다. 두 멤버가 모두 매개 변수화 된 후에 만 ​​템플릿 템플릿 매개 변수로 오류가 발생합니다.

나는 (-std = C + +0 4.4.1 ++ g와 잘 컴파일) 다음 코드를 한 :

#include <iostream> 

using namespace std; 

enum class Labels { A , B }; 

template <Labels L> 
struct LabelTypeMap { 
typedef int type_t; 
}; 

template<> struct LabelTypeMap<Labels::B> { typedef double type_t; }; 

template <bool Enable=true> 
struct Hold 
{ 
typedef Labels enum_t; 
}; 

template <> 
struct Hold<true> 
{ 
typedef Labels enum_t; 
}; 

template< typename Holder , template< typename Holder::enum_t > class typeMap , bool Enable > 
struct Whatever 
{ 
template < typename Holder::enum_t label > 
void Operate(typename typeMap<label>::type_t parameter) {}; 
}; 

template< typename Holder , template< typename Holder::enum_t > class typeMap > 
struct Whatever< Holder , typeMap , true > : public Holder 
{ 
template < typename Holder::enum_t label > 
void Operate(typename typeMap<label>::type_t parameter) { cout << "operate on " << parameter << endl; }; 
}; 

template < bool Enable > 
struct Now { 
typedef Hold<true> MyHold; // <----- check this out! 
typedef Whatever< MyHold , LabelTypeMap , Enable > concrete_t; 
}; 

int main() { 
Now<true>::concrete_t obj; 
obj.Operate<Labels::A>(3.222222222222222222222); 
obj.Operate<Labels::B>(3.2222222222222222222); 
}; 

그러나 이제, Now 템플릿을보고 : 나는 두 멤버가 부울에 의해 매개 변수화 된 concrete_tNow 템플릿의 bool 매개 변수에 따라 달라지며 MyHold은 그렇지 않습니다. 나는 그것을 변경하려면, 그래서 나는이 하나와 Now 선언 대체 :

template < bool Enable > 
struct Now { 
typedef Hold<Enable> MyHold; // <----- boom! 
typedef Whatever< MyHold , LabelTypeMap , Enable > concrete_t; 
}; 

을하지만 다음과 같은 오류가 날 수 있습니다 :이에서 오랫동안 응시 한

error: type/value mismatch at argument 2 in template parameter list for ‘template<class Holder, template<typename Holder::enum_t <anonymous> > class typeMap, bool Enable> struct Whatever’ 
error: expected a template of type ‘template<typename Holder::enum_t <anonymous> > class typeMap’, got ‘template<Labels L> struct LabelTypeMap’ 

와 내가 말을해야 나는이 간단한 변화가 왜 오류를 일으키는 지 완전히 알지 못한다. 어떤 아이디어?

편집 : 여기에 문제의 최소 박람회의 (희망) 쉽게 숙고 할 수 있도록 :

: 누군가가 혼란을 알아낼 수있을 때까지, 여기에
$ cat templatetemplate.cc 
template <int i> 
struct LabelTypeMap { typedef int type_t; }; 

template <bool> 
struct Hold { typedef int type; }; 

template<typename Holder, template<typename Holder::type> class typeMap> 
struct Whatever { }; 

template <bool Enable> 
struct Now { typedef Whatever<Hold<ENABLE>, LabelTypeMap> concrete_t; }; 

Now<true>::concrete_t obj; 

$ g++ -DENABLE=Enable -c templatetemplate.cc 
templatetemplate.cc:11: error: type/value mismatch at argument 2 in template parameter list for ‘template<class Holder, template<typename Holder::type <anonymous> > class typeMap> struct Whatever’ 
templatetemplate.cc:11: error: expected a template of type ↵ 
    ‘template<typename Holder::type <anonymous> > class typeMap’, got ↵ 
    ‘template<int i> struct LabelTypeMap’ 
[email protected]:~/play$ 
$ g++ -DENABLE=true -c templatetemplate.cc 
(no error) 
+0

C++ 0x와의 연결은 무엇입니까? 아, 그것을 발견 :'enum 클래스'. –

+0

실제로 관련성이 있는지 알 때까지 태그를 제거했습니다. 어쩌면 그것은 – lurscher

+0

이 아닙니다. (적어도 열거 형 클래스에 대해서는 질문에 관심이 없지만) – icecrime

답변

1

이 해결 방법 컴파일입니다
template < bool Enable > 
struct Now; 

template <> 
struct Now<false> { 
    typedef Hold<false> MyHold; 
    typedef Whatever< MyHold , LabelTypeMap , false > concrete_t; 
}; 

template <> 
struct Now<true> { 
    typedef Hold<true> MyHold; 
    typedef Whatever< MyHold , LabelTypeMap , true > concrete_t; 
}; 
+0

+1 테스트 케이스 단축 – lurscher

관련 문제