I의 포인터 (즉 I *)를 저장할 수 있도록 클래스 GList의 부분 특수화를 만드는 방법은 무엇입니까?포인터의 부분 특수화
template <class I>
struct TIList
{
typedef std::vector <I> Type;
};
template <class I>
class GList
{
private:
typename TIList <I>::Type objects;
};
I의 포인터 (즉 I *)를 저장할 수 있도록 클래스 GList의 부분 특수화를 만드는 방법은 무엇입니까?포인터의 부분 특수화
template <class I>
struct TIList
{
typedef std::vector <I> Type;
};
template <class I>
class GList
{
private:
typename TIList <I>::Type objects;
};
허용하도록 전문화 할 필요는 없습니다. 이미 포인터를 저장할 수 있습니다.
GList<int*> ints;
어쨌든 포인터에 대해 GList를 전문화하려면 다음 구문을 사용하십시오.
template <class I>
class GList<I*>
{
...
};
그런 다음 일반 템플릿과 마찬가지로 I
을 사용하십시오. 위의 예제에서는 GList<int*>
으로 포인터 전문화가 사용되며 I
은 int
이됩니다.
이전 게시물은 포인터 유형을 전문으로하지 않아도되지만 실제로는 그렇다고 말할 수 있습니다.
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();
}
};
그건 정말 나쁜 생각입니다. 전문 분야에서 의미를 변경해서는 안됩니다. 그렇게하면'std :: vector
이것이 정말로 (정말로) 나쁜 생각이라고 생각하기 때문에 만 다운 투표를합니까? 이것은 특수화가 필요한 경우의 유효한 사례입니다. 귀하가 말하는 것은 디자인 문제입니다. – MatiasFG
을 그리고 전문 클래스의 GList 는 개인 데이터 멤버 객체의 구현을해야합니다? – Woody
예, 특수화는 원래 기본 템플릿과 아무 것도 공유하지 않습니다. 모든 멤버 변수와 멤버 함수를 다시 작성해야합니다 (또는 가능하면 공통 기본 클래스로 팩터를 추출해야합니다). –
ponters를 처리하는 메소드 내에 다른 코드가 필요합니다. 포인터 전용 메서드를 전문으로했습니다 : void GList 메서드() {...} 및 void GList 메서드 {...}. 그러나 컴파일러는 그들 사이의 차이점을 인식하지 못합니다 .... – Woody