Có ai biết tại sao việc sử dụng khai báo dường như không hoạt động để nhập tên kiểu từ các lớp cơ sở phụ thuộc không? Chúng hoạt động cho các biến thành viên và các hàm, nhưng ít nhất trong GCC 4.3, chúng dường như bị bỏ qua đối với các kiểu.Truy cập các loại từ các lớp cơ sở phụ thuộc
template <class T>
struct Base
{
typedef T value_type;
};
template <class T>
struct Derived : Base<T>
{
// Version 1: error on conforming compilers
value_type get();
// Version 2: OK, but unwieldy for repeated references
typename Base<T>::value_type get();
// Version 3: OK, but unwieldy for many types or deep inheritance
typedef typename Base<T>::value_type value_type;
value_type get();
// Version 4: why doesn't this work?
using typename Base<T>::value_type;
value_type get(); // GCC: `value_type' is not a type
};
Tôi có một lớp cơ sở với tập hợp kiểu chữ phân bổ theo kiểu cấp phát mà tôi muốn kế thừa trong nhiều cấp thừa kế. Các giải pháp tốt nhất tôi đã tìm thấy cho đến nay là phiên bản 3 ở trên, nhưng tôi tò mò tại sao Phiên bản 4 dường như không hoạt động. GCC chấp nhận việc sử dụng khai báo, nhưng dường như bỏ qua nó.
Tôi đã kiểm tra C++ Standard, C++ Prog. Lang. Ed thứ 3 [Stroustrup], và C++ Templates [Vandevoorde, Josuttis], nhưng dường như không có địa chỉ cho dù việc sử dụng khai báo có thể được áp dụng cho các loại lớp cơ sở phụ thuộc hay không.
Trong trường hợp nó giúp xem ví dụ khác, here is the same question being asked, nhưng không thực sự được trả lời, trong danh sách gửi thư của GCC. Người hỏi chỉ ra rằng anh ta đã thấy 'sử dụng tên tệp' ở nơi khác, nhưng GCC dường như không hỗ trợ nó. Tôi không có trình biên dịch phù hợp khác để kiểm tra nó.
Đăng một số mã cần biên dịch (theo ý kiến của bạn) để tuân thủ các trình biên dịch, nhưng không. Và đăng cách bạn đang sử dụng mẫu. –
Tôi tin rằng tất cả thông tin liên quan đều ở trên. Phiên bản 1-4 hoạt động trên MSVC 9, có độ phân giải tên một giai đoạn không phù hợp (tức là tại thời điểm khởi tạo). Chỉ có phiên bản 2 & 3 hoạt động trên GCC 4.3. Tôi không biết lý do nào Phiên bản 4 sẽ không hợp lệ, nhưng GCC sẽ không chấp nhận nó. Đối với việc sử dụng, nó không thực sự quan trọng làm thế nào điều này được khởi tạo. Tôi chỉ đang cố gắng để có được bản khai mẫu để biên dịch. Đoạn mã trên là một sự đơn giản hóa của một bộ điều hợp container phức tạp hơn nhiều. –
Khi đăng mã ở đây, đừng mong đợi mọi người phải chỉnh sửa mã để biên dịch mã. –