2010-02-11 15 views
5

Đoạn code dưới đây cung cấp cho các lỗi:STL lỗi biên dịch khi xác định iterator trong lớp mẫu

error: type ‘std::list<T,std::allocator<_Tp1> >’ is not derived from type ‘Foo<T>’
error: expected ‘;’ before ‘iter’

#include <list> 

template <class T> class Foo 
{ 
    public: 
     std::list<T>::iterator iter; 

    private: 
     std::list<T> elements; 
}; 

Tại sao và điều này nên được có đúng không?

Trả lời

7

Bạn cần typename std::list<T>::iterator. Điều này là do list phụ thuộc vào tham số mẫu, do đó trình biên dịch không thể biết chính xác tên là iterator bên trong nó sẽ là (tốt, về mặt kỹ thuật nó có thể biết, nhưng tiêu chuẩn C++ không hoạt động theo cách đó). Từ khóa typename cho trình biên dịch biết những gì sau là tên của một loại.

+1

tôi vẫn không nhận được tại sao điều này là như vậy. Ví dụ, tại sao chúng ta không cần sử dụng 'typename std :: list elements'? –

+1

@Agnel: Bởi vì sau đó chúng tôi sẽ không cố gắng truy cập các tên được xác định trong một lớp mẫu. – UncleBens

3

Bạn cần một typename

template <class T> class Foo { 
    public: 
     typename std::list<T>::iterator iter; 

    private: 
     std::list<T> elements; 
}; 
Các vấn đề liên quan