2010-07-22 57 views
76

Phạm vi phụ thuộc là gì và ý nghĩa của tên tệp trong ngữ cảnh của lỗi sau là gì?Mẫu lồng nhau có phạm vi phụ thuộc

$ make 
g++ -std=gnu++0x main.cpp 
main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope 
make: *** [all] Error 1 


/* 
* main.cpp 
*/ 

#include <vector> 
#include <memory> 

template<typename T> 
struct ptrModel 
{ 
typedef std::unique_ptr<T> Type; 
}; 


template<typename Data> 
struct ptrType 
{ 
typedef ptrModel< std::vector<Data> >::Type Type; 
}; 

int main() 
{ 
return 0; 
} 

Trả lời

118

Trình biên dịch đã cho bạn biết chính xác phải làm gì. Viết typename trước ptrModel<std::vector<Data> >::Type, như vậy:

typedef typename ptrModel<std::vector<Data> >::Type Type; 

Các lý do cho yêu cầu này là trình biên dịch không vào thời điểm này biết liệu ptrModel<std::vector<Data> >::Type mô tả một biến thành viên hoặc một loại lồng nhau. Nó thậm chí không thể tìm ra bằng cách nhìn vào định nghĩa của ptrModel bởi vì có thể có một chuyên môn của ptrModel cho std::vector<Data> ở một nơi khác trong chương trình mà nó vẫn chưa nhận được thay đổi mà những điều này ::Type đề cập đến. Vì vậy, bạn cần phải nói một cách rõ ràng.

Tên ptrModel<std::vector<Data> >::Type có "phạm vi phụ thuộc" vì phạm vi đó nằm trong phạm vi phụ thuộc vào khi khởi tạo mẫu.

+6

Được rồi, nhưng không phải là sự thật khi gõ một biến thành viên là không hợp lý? – user383352

+5

Có, nhưng điều đó không nhất thiết phải trợ giúp do một số chi tiết về cách các mẫu được phân tích cú pháp bởi trình biên dịch. Xem câu trả lời được chấp nhận cho câu hỏi này: http://stackoverflow.com/questions/642229/why-do-i-need-to-use-typedef-typename-in-g-but-not-vs –

+5

Tôi cũng tìm thấy [ câu trả lời này] (http://stackoverflow.com/a/6571836/24874) sẽ rất hữu ích khi gặp lỗi và khái niệm này lần đầu tiên. –

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