2012-12-19 2 views
5

혼란스러운 제목에 대해 유감이지만 더 자세히 설명하려고합니다. 나는이 특정 문제를 검색을 통해 찾을 수 없었습니다. 그래서 놓친 경우 올바른 스레드로 나를 가리켜주십시오 ...C++에서 다른 클래스 템플릿을 상속 한 클래스 템플릿 선언

저는 클래스 템플릿을 기반으로 사용하고있는 하나의 매개 변수에 따라 달라집니다 클래스 :

template <class TVertex> 
class DrawExecutorDX11 
{ 
public: 
    DrawExecutorDX11(); 
    virtual ~DrawExecutorDX11(); 
    void AddVertex(const TVertex& vertex); 

protected: 
    TGrowableVertexBufferDX11<TVertex> VertexBuffer; 
}; 

내가하고 싶은 것은이 클래스 템플릿에서 상속하는 것이며, 동시에 하위 클래스에 다른 클래스 템플릿 매개 변수를 추가합니다. 나는이 구성 날과 같이 서브 클래스 템플릿의 인스턴스를 선언 할 수 있도록 할 것으로 기대하고있다

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11<TInstance> : public DrawExecutorDX11<TVertex> 
{ 
public: 
    DrawInstancedExecutorDX11(); 
    virtual ~DrawInstancedExecutorDX11(); 

    void AddInstance(const TInstance& data); 

protected: 
    TGrowableVertexBufferDX11<TInstance> InstanceBuffer; 
}; 

: 구문에서 내 시도는이 같은 것 그러나

DrawInstancedExecutorDX11<VertexStruct,InstanceStruct> myExecutor; 

, VS2012은 '아무튼 심지어 하위 클래스를 컴파일하는 것을 고려하고 DrawInstancedExecutorDX11 클래스 다음에 세미콜론이 필요하다는 것을 나타냅니다. 솔직히 말하자면, 전에 이런 유형의 템플리트 배열을 시도한 적이 없으므로 다른 사람이이 작업을 수행했는지 궁금합니다. 그렇다면 기본 구문 오류가 있습니까? 아니면 다른 문제가 있습니까? 당신이 줄 수있는 도움이나 안내에 미리 감사드립니다!

답변

4

클래스 이름 바로 뒤에 각괄호를 사용하는 경우 기본 템플릿이 아니라 템플릿 특수화를 선언하고있는 것입니다. 당신이 템플릿 매개 변수 TVertexTInstance 참조 할 수 클래스 내부

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex> 
{ 
    //... 
}; 

, 그 클래스 밖에서는 DrawInstancedExecutorDX11<SomeVtxType, SomeInstType>을 사용할 수 있습니다 : 올바른 기본 클래스 템플릿입니다.

+0

옆에 빈 체크 표시가 나타납니다. 답변을 주셔서 감사합니다 (@ K-ballo와 동시에 답변하셨습니다). 또한 답변에 대한 추가 컨텍스트가 추가됩니다. 다시 한 번 감사드립니다! –

1

기본 템플릿 정의를 선언하지 않고 부분 전문화를 선언하려고합니다. DrawInstancedExecutorDX11<TInstance>의 선언하기 전에 귀하의 첫 번째 컴파일러 에러를 타고 얻을 수 있지만 나중에 실패

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11; 

가 필요합니다. 나는 당신이 이것을 실제로 성취하려고 노력하고 있는지 확실하지 않습니다.

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex> 
{ ... }; 
+0

'VertexBuffer'멤버를 사용하여 한 세트의 작업을 제공하고 'InstanceBuffer'멤버를 사용하여 다른 작업 집합으로 해당 기능의 일부를 전문화하는 기본 클래스를 정의하려고합니다. 일반적인 상속의 유일한 차이점은 두 멤버 변수의 유형이 일반적인 것입니다. –

+1

@ Jason Zink : 그렇다면'template 클래스 DrawInstancedExecutorDX11 : public DrawExecutorDX11 '을 원합니까? –

+0

예! 그게 문제 였어. 서브 클래 싱 선언에 템플릿 인수를 추가하면 안된다. 도움을 주셔서 감사합니다 - 나는 그것이 작은 구문 오류가 될 줄 알았어! 어떻게 대답 해 줄 수 있습니까? –

관련 문제