2012-04-06 4 views
2

중첩 템플릿과 그 템플릿 전문화에 문제가 있습니다.템플릿 특수화 <typename T 템플릿 <typename> class U>

작은 템플릿 클래스

template<class U> 
class T { 
public: 
    T(){} 
    virtual ~T(){} 

}; 

그리고 중첩 템플릿

template<typename T, template<typename> class U> 
class A { 
public: 
    void foo() 
    { 
     std::cerr << "A generic foo"; 
    } 
}; 

어떤 종류의 작은 MAIN.CPP

int main(int argc, const char *argv[]) 
{ 
    A<int,T> *a = new A<int,T>; 
    a->foo(); 

    //This wont work: 
    A<double,T*> *b = new A<double,T*>; 
    b->foo(); 

    return 0; 
} 

지금 내가 필요 : 다음 클래스 감안할 때 U가 포인터 인 경우 특수화 :

A<double,T*> *b = new A<double,T*>; 
    b->foo(); 

어떻게해야합니까? 내가 좋아하는 뭔가를 시도 :

template<typename T, template<typename> class U> 
class A< T, U* > 
{ 
public: 
void foo() 
{ 
    std::cerr << "A specialized foo"; 
} 
}; 

을하지만 T*은 아무런 의미가 없기 때문에 그냥, 당신이 할 보내려하는 것은 불가능하다

A.h:18:16: Error: Templateargument 2 is invalid 
+0

혼란스러워합니다. –

+0

@ildjarn : 아니요. 'A'는 하나의 매개 변수를 가진 템플릿 유형을 기대하기 때문에 괜찮습니다. 'T'는 그 법안에 부합한다. – bitmask

+0

@bitmask : 아, 완전히 맞았습니다. 나는 분명히 관심을 기울이지 않았습니다. – ildjarn

답변

0

에서 해결합니다. 적절한 유형이 아니며 추가 매개 변수가 필요한 템플리트와 일치하지도 않습니다. UT*을 나타내면 U<int>은 무엇입니까? T<int>*을 의미 할 수도 있지만 선언문과 일치하지 않으므로 해당 유형을 A에 연결할 수 없습니다.

당신은 내 머리 꼭대기에서 이것과 같은 것을 얻을 수있는 방법을 물었습니다.

나는이 기본적으로 Expander를 호출하고 설정 것이다, A에 세 번째 템플릿 인수를 수락 :

template <typename T> struct Expander { 
    typedef T type; 
}; 

을 그리고, A를 호출 할 때

A<int,T> normal; 
A<int,T,PtrExpander> pointer; 

말할 수

template <typename T> struct PtrExpander { 
    typedef T* type; 
}; 

A은 다음과 같습니다.

template<typename T, template<typename> class U, template <typename> class E = Expander> class A { 
    typedef typename E<U<Your_Args_to_U> >::type; 
+0

하지만 T는 템플릿을 나타내지 않습니까? – user988017

+0

@ user988017 : 예,하지만'T *'는 그렇지 않습니다. 'T'는 타입이 아니기 때문에 (템플릿입니다) 포인터를 가질 수 없습니다. C++ *에서는이 비공식 표기법을 사용할 수 있지만 그렇게하지는 않습니다. – bitmask

+0

나는 이것을 보려고 가장 쉬운 방법은 무엇입니까? – user988017

관련 문제