2013-10-24 3 views
1

템플릿 인수를 통해 내부 컨테이너 구조를 지정하고 Top 함수를 특수화 할 수있는 큐 템플릿 클래스가 필요합니다 (다른 컨테이너가 앞 항목에 액세스 할 때 다른 함수 이름을 사용하므로).클래스 함수 템플릿 전용 인수가있는 부분 특수화

template<class I, class C = std::queue<I>> 
class Queue 
{ 
    C items; 
public: 
    I* Top() 
    { 
     std::cout << "this is a queue" << std::endl; 
     return &items.front(); 
    } 
}; 

template<class I> 
void I* Queue<I, std::priority_queue<I>>::Top() 
{ 
    std::cout << "this is a priority_queue" << std::endl; 
    return &items.top(); 
} 

그러나이 코드는 많은 컴파일 오류를 발생시킵니다. 누군가 템플릿 클래스를 설계하는 잘못된 방향으로 가고 있다는 힌트를 줄 수 있습니까? 감사.

+0

을 정확히 어쨌든?에 관계없이'*는'무효 무엇,'items' 타입 C의, 그리고 하나의 멤버 함수의 마법은 예정되지 않는다 그것을 바꾸는 것. – WhozCraig

+0

죄송합니다 ... 오타입니다. Top() 함수의 반환 형식은 I * 대신 I *가되어야합니다. – Elliott

답변

1

(구성원) 함수 템플릿을 부분적으로 특수화하려고합니다. 함수 템플릿은 C++에서 부분적으로 특수화 될 수 없습니다. 전체 수업을 부분적으로 전문화하거나 원하는 다른 방법을 찾아야합니다. 예를 들어, Top()의 특성을 사용할 수

I* Top() 
{ 
    return MyQueueTraits<I, C>::GetTop(items); 
} 

template <class I, class C> 
struct MyQueueTraits 
{ 
    static I* GetTop(C &c) { return &c.front(); } 
}; 

template <class I> 
struct MyQueueTraits<I, std::priority_queue<I>> 
{ 
    static I* GetTop(std::pirority_queue<I> &c) { return &c.top(); } 
}; 
+0

예! 그것은 내 구현을 위해 작동합니다. 고마워요! :) – Elliott

관련 문제