2009-05-09 28 views
11

Tôi cố gắng để biên dịch đoạn mã sau trên Linux dùng gcc 4.2:loại/giá trị không phù hợp trong mẫu C++ khai báo lớp

#include <map> 
#include <list> 

template<typename T> 
class A 
{ 
... 

private: 
    std::map<const T, std::list<std::pair<T, long int> >::iterator> lookup_map_; 
    std::list<std::pair<T, long int> > order_list_; 

}; 

Khi tôi biên dịch lớp này, tôi nhận được thông báo sau đây từ gcc:

error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’ 
error: expected a type, got ‘std::list<std::pair<const T, long int>,std::allocator<std::pair<const T, long int> > >::iterator’ 
error: template argument 4 is invalid 

Tôi đã xóa tên tệp và số dòng, nhưng tất cả đều đề cập đến dòng tuyên bố bản đồ.

Khi tôi thay thế cặp trong các biểu thức này bằng một loại int hoặc một số loại cụ thể, nó biên dịch tốt. Ai đó có thể vui lòng giải thích cho tôi những gì tôi đang làm sai.

Trả lời

21

Bạn cần phải viết typename trước std::list<...>::iterator, vì iterator là một loại lồng nhau và bạn đang viết một bản mẫu.

Edit: nếu không có sự typename, GCC giả định (như là tiêu chuẩn yêu cầu) mà iterator thực sự là một biến tĩnh trong list, chứ không phải là một loại. Do đó lỗi "loại tham số không khớp".

3

Mã của bạn cần từ khóa "tên tệp".

std::map<const T, typename std::list<std::pair<T, long int> >::iterator> lookup_map_; 
Các vấn đề liên quan