2010-05-18 41 views
8

Tôi có đoạn mã sau:Không thể tham khảo một mẫu tên lồng nhau trong một tham số mẫu

template <typename Provider> 
inline void use() 
{ 
    typedef Provider::Data<int> D; 
} 

đâu Tôi về cơ bản cố gắng sử dụng một thành viên lớp mẫu 'dữ liệu' của một số lớp 'cung cấp', áp dụng đến 'int', nhưng tôi nhận được các lỗi sau:

util.cpp:5: error: expected init-declarator before '<' token 
util.cpp:5: error: expected `,' or `;' before '<' token 

Tôi đang sử dụng GCC 4.3.3 trên hệ thống Solaris.

+0

thể trùng lặp của [C++ chức năng template thành viên của lớp mẫu gọi là từ mẫu chức năng] (http://stackoverflow.com/questions/1840253/c-template -member-function-of-template-class-called-from-template-function) –

+1

@Kirill: Tôi nghĩ cái này là duy nhất ở chỗ nó đòi hỏi cả 'typename' và' template'. (Tôi đã vật lộn một lúc với cách giải thích điều này bằng cách sử dụng cùng một mã và tôi không hài lòng.) – sbi

+0

@ sbi, vâng, điều này không chính xác như nhau, nhưng câu hỏi rất giống nhau. –

Trả lời

16
typedef typename Provider::template Data<int> D; 

Vấn đề là, khi biên dịch phân tích use() cho lần đầu tiên, nó không biết Provider, vì vậy nó không biết gì Provider::Data đề cập đến. Nó có thể là một thành viên dữ liệu tĩnh, tên của một hàm thành viên hoặc một cái gì đó khác. Đó là lý do tại sao bạn phải đặt typename vào.
Cần thêm template bất cứ khi nào tên lồng nhau là tên mẫu. Nếu nó là cái gì khác, thì Data < ... có thể là một so sánh.

+0

Nó hoạt động. Cảm ơn! – chila

8

Bạn cần một typenametemplate:

template <typename Provider> 
inline void use() 
{ 
    typedef typename Provider::template Data<int> D; 
} 
+0

Cảm ơn bạn. – chila

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