2010-10-14 28 views
6

Tôi đã cố gắng googling này, nhưng tôi đã không thể đưa ra một câu trả lời phù hợp. Có thể bất kỳ C++ rất kinh nghiệm cho tôi biết lý do tại sao C++ yêu cầu bạn khai báo OuterClass <T> :: Lớp bên trong với từ khóa typename?Tên và lớp bên trong C++

Tôi là nhân viên hỗ trợ cho khóa học cấu trúc dữ liệu và tôi thấy lỗi này mọi lúc. Tôi biết nói với các sinh viên của tôi rằng họ cần phải đặt tên tập tin trước kiểu trả về, nhưng tôi không thể giải thích tại sao điều này là bắt buộc.

Cảm ơn.

+0

Bạn có thể cho một ví dụ mã nhỏ? –

Trả lời

6

Đó là do tra cứu tên hai giai đoạn trong các mẫu. Khi trình biên dịch thấy lớp bên trong, nó phải biết liệu tên đó có phải là một kiểu hay không (ví dụ, có thể là một thành viên tĩnh của kiểu int cho một số chuyên môn của OuterClass). Vì vậy, nó cho rằng nó không phải là một tên loại trừ khi bạn nói như vậy. tên tệp phải được sử dụng trong các mẫu và chỉ trên các tên phụ thuộc vào tham số mẫu. HTH

dụ:

template <class T> 
class X 
{ 
    typedef T XXX; 
}; 
template<> 
class X<char> 
{ 
    static int XXX; 
}; 

template<class T> 
class Y 
{   
    // X<T>::XXX member; invalid XXX is not assumed to be a type! 
    typename X<T>::XXX member; 
    //we explicitly specify that XXX is a type; Later, upon instantiation, we will verify that 
}; 
4

OuterClass<T>::Innerclass

Đó vì Innerclass đại diện cho một type (như tôi có thể nhìn thấy từ câu hỏi của bạn), do đó bạn cần phải thêm từ khóa typename trước OuterClass<T>::Innerclass

Ví dụ:

template <class T> 
void foo() { 
    T::iterator * iter; 
    ... 
} 

Without typenameT::iterator * iter; sẽ được hiểu là phép toán nhân giữa T::iteratoriter

+2

Trên thực tế lý do là trình biên dịch không thể xác định thông tin này (do các mẫu) tại thời điểm khi anh ta cần nó. –

+1

@Let_Me_Be: Trình biên dịch biết cách giải thích mã. Nó không thể xác định ý định * của lập trình viên *. Và sau đó có VC + + mà không kiểm tra tên phụ thuộc và làm việc những điều khi mẫu được intantiated. VC++ có thể tạo ra cả phép nhân và khai báo con trỏ từ cùng một hàm trong điều kiện thích hợp :) – UncleBens

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