C++는

2011-02-23 2 views
7

내가 클래스 템플릿을 가지고 ABC라는 이름의 클래스가 객체 다른 클래스 템플릿 매개 변수가있는 ABC 개체를 저장하려고합니다. 컴파일 할 때 포인터에 대해서도 템플릿을 지정해야합니까? 컨테이너가 다른 유형의 객체를 저장한다고 가정하면 어떻게 될까요? 그게 가능하지 않니?C++는

답변

7

심지어 컴파일시 포인터에 대한 템플릿을 지정할 필요가 있습니까?

예.

컨테이너가 다른 유형의 객체를 저장할 예정이라면? 그게 가능하지 않니?

(직접) 가능하지 않습니다.

클래스 ABC와 같은 것은 없습니다. ABC<Foo>ABC<Bar>과 같은 ABC의 인스턴스화 만 있습니다. 이들은 완전히 다른 클래스입니다.

당신은 같은 것을 할 수 있습니다 : 이렇게

template<typename T> 
class ABC : public ABC_Base 
{ 
    ... 
} 

list<ABC_Base*> some_list; 

를, 당신의 ABC 인스턴스화 모두 공통 기본 유형을 가지고, 당신은 임의로 기본 포인터를 사용할 수 있습니다.

+0

약간의 단점이 있습니다. 템플릿을 사용하는 모든 이유는 객체가 단단히 결합되어 있는지 확인하기 위해서였습니다. 이렇게하면 템플릿 유형없이 ABC_Base (또는 파생 클래스)의 객체를 만들고 목록에서 사용할 수 있습니다. – cyrux

+4

@cyrux'ABC_Base'를 추상화하면 아무도'ABC_Base'의 객체를 만들 수 없습니다. – user470379

1

CDE 클래스에 템플릿 매개 변수를 지정하거나 CDE 템플릿을 템플릿으로 지정해야합니다.

첫 번째 옵션 :

class CDE { 
private: 
    list< ABC<int>* > some_list; 
}; 

두 번째 옵션 :

template <class T> 
class CDE { 
private: 
    list< ABC<T>* > some_list; 
}; 
1

목록에는 하나의 유형 만 저장할 수 있습니다. 템플리트의 다른 인스턴스화는 다른 유형입니다. 이 만족스러운 경우, 당신은 이런 식으로 작업을 수행 할 수 있습니다

template <class T> class CDE{ private: list<ABC<T> *> some_list; }

당신이 다른 유형을 사용해야하는 경우, 아마 당신은 그에게 ABC 저장 포인터를위한 템플릿이 아닌 기본 클래스를 만들 수 있습니다. (예 : 인터페이스 사용)