2009-07-07 32 views
5

noob tại đây vẫn đang thử nghiệm với các mẫu. Đang cố gắng viết mẫu lớp xử lý tin nhắnLớp mẫu bên trong mẫu lớp trong C++

template <typename T> class MessageProcessor { 

    //constructor, destructor defined 
    //Code using t_ and other functions 
foo(void) { 

//More code in a perfectly fine method 
} 
    private: T *t_ 

}; 

Tất cả được xác định trong tệp tiêu đề. Tôi đã xây dựng và kiểm tra lớp học của mình và tất cả đều tốt. Bây giờ, tôi đang cố gắng thực hiện điều này:

template <typename T> class MessageProcesor { 

    //Same stuff as before 

foo(void) { 
//Same code as before in foo, but one new line: 
    t_->getMessageSender<MessageType>(); 

} 

private: T *t_; 
}; 

Tuy nhiên, dòng này cung cấp cho tôi lỗi của biểu thức xấu trước khi ký hiệu '>'.

Tôi đã thêm các tệp tiêu đề cần thiết để xác định loại MessageType. Tôi đã sử dụng chức năng này nhiều lần trước đây, không phải trong ngữ cảnh này.

Tôi nghi ngờ rằng trình biên dịch không thích thực tế là hàm mẫu được định nghĩa đầy đủ (chuyên biệt?) Trong một mẫu lớp không xác định (không chuyên biệt?). Tôi không hoàn toàn grokking những gì làm cho một mẫu 'chuyên'. Hầu hết các giải thích tập trung vào các khái niệm 'đầy đủ' hoặc 'một phần', nhưng không phải là những gì làm cho nó trở nên chuyên biệt ngay từ đầu.

Xin lỗi nếu bạn muốn xem thêm mã. Tôi không có truy cập internet tại nơi làm việc và đó là nơi tôi đang làm điều này, vì vậy tôi phải đặt tất cả mọi thứ vào tinh thần của tôi 'scratchpad' và mang nó về nhà.

+2

Đăng mã chức năng getMessageSender tại đây. –

+0

thực phẩm không có loại trả lại, đó là vấn đề của bạn –

+0

Bạn hoàn toàn chính xác trong các quan sát của mình. Tuy nhiên, đó là lỗi chính tả. Vấn đề thực tế là thiếu từ khóa 'mẫu' như được trả lời bởi Faisal – user106740

Trả lời

9

hàm thành viên của bạn 'foo' cần một kiểu trả về và bạn cần phải sử dụng từ khoá 'mẫu' khi bạn sử dụng các mẫu thành viên trong các biểu thức phụ thuộc (biểu thức có ý nghĩa dựa trực tiếp hoặc gián tiếp vào một tham số mẫu chung)

t_->template getMessageSender<MessageType>(); // ok 
t_->getMessageSender<MessageType>(); // not ok 

Có lẽ ví dụ này sẽ giúp bạn đánh giá cao khi mẫu thành viên cần được bắt đầu bằng từ khóa 'mẫu' [Lưu ý: vì lợi ích đối xứng, bạn luôn có thể sử dụng tiền tố 'mẫu' trên mẫu thành viên, nhưng tùy chọn khi được sử dụng trên biểu thức không phụ thuộc.

struct MyType 
{ 
    template<class T> void foo() { } 
}; 

template<class U> 
struct S 
{ 
    template<class T> 
    void bar() 
    { 
    MyType mt; // non-dependent on any template parameter 
    mt.template foo<int>(); // ok 
    mt.foo<int>(); // also ok 

    // 't' is dependent on template parameter T 
    T t; 
    t.template foo<int>(); // ok 
    t.foo<int>(); // not ok 

    S<T> st; // 'st' is dependent on template parameter T 
    st.template foo<int>(); // ok 
    st.foo<int>(); // not ok 


    S<MyType> s; // non-dependent on any template parameter 
    s.bar<int>(); // ok 
    s.template bar<int>(); // also ok 

    } 

}; 

Hy vọng điều đó sẽ hữu ích.

+0

Bạn cần làm trình biên dịch nào? –

+0

@Edouard - Chuẩn chỉ yêu cầu tiền tố 'mẫu' khi truy cập các mẫu thành viên từ một định danh phụ thuộc vào tham số mẫu - hầu hết các trình biên dịch sẽ nhận được quyền này vì đây là một phần của tiêu chuẩn kể từ '98 - trong '03 các quy tắc vì mục đích đơn giản để bạn có thể sử dụng nó trên tất cả các truy cập mẫu thành viên - và bên cạnh các trình biên dịch EDG (hầu hết có được quyền này), tôi chưa kiểm tra nó trên bất kỳ trình biên dịch nào khác - hãy cho tôi biết nếu bạn có. –

0

Có khả năng, MessageType không được biết tại thời điểm đó. Bạn có thiếu một bao gồm, một độ phân giải không gian tên hoặc một tuyên bố?

nếu không phải vậy, cách getMessageSender được khai báo và cách MessageType?

Nói chung, trong C++ không phải là vấn đề nếu T không được biết tại thời điểm đó (vâng ... nó phức tạp, nhưng vẫn còn).

Ngoài ra, thông báo lỗi thường chứa loại mà nó được cố gắng để được insantiated. Cố gắng đăng thông báo lỗi đầy đủ ít nhất.

0

Bạn có các cuộc gọi tương tự khác với các phương thức như getMessageSender được templatized không?

t_->getMessageSender<MessageType>(); 
2

Thêm từ khóa template giữa -> và tên của mẫu phương pháp:

t_->template getMessageSender<MessageType>(); 
0

Nó chỉ là kiểu trả về của hàm của bạn đó là mất tích. Thành viên t_ được xác định đầy đủ.

Chuyên môn hóa mẫu là phiên bản 'đặc biệt', triển khai của bạn cho các đối số mẫu cụ thể. Ví dụ: std::vector là phiên bản chuyên biệt của chung std::vector.

Chuyên môn hóa một phần là triển khai mã chung của bạn mà không phải tất cả các đối số mẫu được cung cấp.

0

Điều này hoạt động tốt trên trình biên dịch Visual Studio 2010.

class One 
{ 
public: 
    void newFoo() ; 
    template < class T > void foo() 
    { 
     T obj ; // obj is dependent on template parameter 
     obj.newFoo() ; // and this works 
    } 
} 

Chỉ cần cập nhật câu trả lời !!!

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