Các mẫu lồng nhau với phạm vi phụ thuộc


79

Phạm vi phụ thuộc là gì và ý nghĩa của tên kiểu trong ngữ cảnh của lỗi sau đây là gì?

$ 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;
}

Câu trả lời:


124

Trình biên dịch cho bạn biết chính xác những gì cần làm. Viết typenametrướ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 bí quyết này cho dù ptrModel<std::vector<Data> >::Typemô 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 điều đó bằng cách xem xét định nghĩa của ptrModelvì có thể có một chuyên môn hóa ptrModelcho std::vector<Data>một nơi nào đó khác trong chương trình mà nó chưa nhận ra những thay đổi mà những thứ này ::Typeđề cập đến. Vì vậy, bạn cần phải nói với nó một cách rõ ràng.

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


6
Được rồi, nhưng có đúng không, không có ý nghĩa gì khi nhập biến thành viên?
user383352,

5
Có, nhưng điều đó không nhất thiết hữu ích do một số chi tiết về cách trình biên dịch phân tích cú pháp các mẫu. Xem câu trả lời chấp nhận cho câu hỏi này: stackoverflow.com/questions/642229/...
Tyler McHenry

5
Tôi cũng thấy câu trả lời này rất hữu ích khi gặp lỗi và khái niệm này lần đầu tiên.
Drew Noakes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.