2011-01-21 6 views
4

I의 포인터 (즉 I *)를 저장할 수 있도록 클래스 GList의 부분 특수화를 만드는 방법은 무엇입니까?포인터의 부분 특수화

template <class I> 
struct TIList 
{ 
    typedef std::vector <I> Type; 
}; 


template <class I> 
class GList 
{ 
     private: 
      typename TIList <I>::Type objects; 
}; 

답변

7

허용하도록 전문화 할 필요는 없습니다. 이미 포인터를 저장할 수 있습니다.

GList<int*> ints; 

어쨌든 포인터에 대해 GList를 전문화하려면 다음 구문을 사용하십시오.

template <class I> 
class GList<I*> 
{ 
    ... 
}; 

그런 다음 일반 템플릿과 마찬가지로 I을 사용하십시오. 위의 예제에서는 GList<int*>으로 포인터 전문화가 사용되며 Iint이됩니다.

+0

을 그리고 전문 클래스의 GList 는 개인 데이터 멤버 객체의 구현을해야합니다? – Woody

+0

예, 특수화는 원래 기본 템플릿과 아무 것도 공유하지 않습니다. 모든 멤버 변수와 멤버 함수를 다시 작성해야합니다 (또는 가능하면 공통 기본 클래스로 팩터를 추출해야합니다). –

+0

ponters를 처리하는 메소드 내에 다른 코드가 필요합니다. 포인터 전용 메서드를 전문으로했습니다 : void GList 메서드() {...} 및 void GList 메서드 {...}. 그러나 컴파일러는 그들 사이의 차이점을 인식하지 못합니다 .... – Woody

5

이전 게시물은 포인터 유형을 전문으로하지 않아도되지만 실제로는 그렇다고 말할 수 있습니다.

struct Bar { 
    void bar(void) { /* do work */ } 
}; 

template <class T> struct Foo { 
    T t; 

    void foo(void) 
    { 
     t.bar(); // If T is a pointer, we should have used operator -> right? 
    } 
}; 

int main(int argc, char * argv[]) 
{ 
    Foo<Bar *> t; 

    t.foo(); 
} 

이 컴파일되지 않습니다

는 다음과 같은 고려하십시오. Foo :: foo에서는 포인터가 있기 때문에 변수로 사용합니다.

다음을 추가하는 경우는 전문화를 사용하고 잘 컴파일 :

// This is a pointer to T specialization! 
template <class T> class Foo<T *> { 
    T * t; 
public: 
    void foo(void) 
    { 
     t->bar(); 
    } 
}; 
+0

그건 정말 나쁜 생각입니다. 전문 분야에서 의미를 변경해서는 안됩니다. 그렇게하면'std :: vector '와 같은 것들로 끝납니다. 'std :: shared_pointer '와 함께'Foo'를 사용하면 어떻게됩니까? 레퍼런스 의미론을 사용하지 않으므로 생각할 수있는 모든 스마트 포인터를 전문으로 할 것입니까? –

+0

이것이 정말로 (정말로) 나쁜 생각이라고 생각하기 때문에 만 다운 투표를합니까? 이것은 특수화가 필요한 경우의 유효한 사례입니다. 귀하가 말하는 것은 디자인 문제입니다. – MatiasFG