2012-12-19 33 views
5

Xin lỗi vì tiêu đề khó hiểu, nhưng tôi sẽ cố gắng xây dựng thêm ở đây. Tôi đã không thể tìm thấy vấn đề này cụ thể thông qua tìm kiếm, vì vậy nếu tôi đã bỏ lỡ xin vui lòng chỉ cho tôi đến đúng chủ đề ...Khai báo mẫu lớp kế thừa từ một mẫu lớp khác trong C++

Tôi có một mẫu lớp phụ thuộc vào một tham số mà tôi đang sử dụng làm cơ sở lớp học:

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

protected: 
    TGrowableVertexBufferDX11<TVertex> VertexBuffer; 
}; 

Điều tôi muốn làm là kế thừa từ mẫu lớp này và đồng thời thêm tham số mẫu lớp khác vào lớp phụ. nỗ lực của tôi vào cú pháp sẽ là một cái gì đó như thế này:

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

    void AddInstance(const TInstance& data); 

protected: 
    TGrowableVertexBufferDX11<TInstance> InstanceBuffer; 
}; 

Tôi hy vọng rằng cấu hình này sẽ cho phép tôi để khai báo một thể hiện của các mẫu lớp con như vậy:

DrawInstancedExecutorDX11<VertexStruct,InstanceStruct> myExecutor; 

Tuy nhiên, VS2012 doesn' t thậm chí xem xét việc biên dịch lớp con và chỉ ra rằng nó đang mong đợi một dấu chấm phẩy sau lớp DrawInstancedExecutorDX11. Thành thật mà nói, tôi chưa bao giờ thử kiểu sắp xếp mẫu này trước đây, vì vậy tôi tự hỏi liệu có ai khác đã làm điều này không. Nếu vậy, có một sai lầm cú pháp cơ bản mà tôi đang làm hoặc một số khác gotcha? Cảm ơn trước vì bất kỳ trợ giúp hoặc hướng dẫn nào bạn có thể cung cấp!

Trả lời

4

Nếu bạn sử dụng bất kỳ dấu ngoặc nhọn nào ngay sau tên lớp, bạn tuyên bố chuyên môn mẫu, không phải mẫu chính. Đúng mẫu lớp chính là:

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

Bên trong lớp mà bạn có thể tham khảo mẫu thông số TVertexTInstance, và bên ngoài lớp học mà bạn có thể sử dụng DrawInstancedExecutorDX11<SomeVtxType, SomeInstType>.

+0

Tuyệt vời - cảm ơn câu trả lời (bạn đã trả lời đồng thời với @ K-ballo). Điều đó cũng bổ sung thêm một số ngữ cảnh bổ sung cho câu trả lời. Cảm ơn một lần nữa! –

1

Bạn đang cố gắng khai báo một phần chuyên môn hóa mà không cần khai báo định nghĩa mẫu chính. Trước tuyên bố của DrawInstancedExecutorDX11<TInstance>, bạn sẽ cần

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11; 

Điều đó sẽ xảy ra lỗi trình biên dịch đầu tiên của bạn, nhưng không thành công sau đó. Tôi không chắc những gì bạn đang thực sự cố gắng thực hiện với điều này. Có vẻ như bạn chỉ cần:

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

Tôi đang cố gắng xác định lớp cơ sở cung cấp một bộ hoạt động (sử dụng thành viên 'VertexBuffer'), và sau đó chuyên một phần chức năng đó với một nhóm hoạt động khác (sử dụng thành viên 'InstanceBuffer'). Sự khác biệt duy nhất để thừa kế thông thường là các kiểu của hai biến thành viên đó là chung chung. –

+1

@ Jason Zink: Sau đó, bạn không chỉ muốn 'mẫu lớp DrawInstancedExecutorDX11: public DrawExecutorDX11 '? –

+0

Có! Đó là vấn đề - tôi không nên thêm các đối số mẫu vào khai báo lớp con. Cảm ơn sự giúp đỡ - Tôi biết nó sẽ là một lỗi cú pháp nhỏ! Làm thế nào tôi có thể cung cấp cho bạn tín dụng cho câu trả lời? –

Các vấn đề liên quan