Tôi đã học C++ templating và tôi đã chạy trên một số hành vi kỳ lạ. Xem xét cấu trúc lớp này (rút gọn từ mã ban đầu của tôi):Truy cập các đối tượng được thừa kế từ mẫu lớp
class A {
public:
std::vector <int> vec;
};
template <typename T> class B : public A { };
template <typename T> class C : public B<T> {
public:
using A::vec;
int test() {
return vec[1]; // OK
}
int test2() {
return vec.size(); // error: 'class A' has no member named 'size'
}
};
Khi biên dịch, tôi nhận được một lỗi trong test2
, nói rằng class A
không có thành viên size
. Nhưng vec
phải là đối tượng vector
, không phải là một thể hiện của A
. Thật vậy, nếu tôi lấy được C
trực tiếp từ A
thay vì B<T>
hoặc xóa mẫu khỏi C
, nó sẽ biên dịch tốt.
Hơn nữa, nếu tôi thêm các phương pháp sau đây để C
:
int test3() {
void ***v = vec; // error: cannot convert from
// 'std::vector<int,...>' to 'void***'
}
trình biên dịch nói nó không thể chuyển đổi từ một vector<int>
để void***
, vì vậy nó có vẻ biết đúng loại cho vec
. Tôi có mắc lỗi ở đây không, hoặc đây có phải là lỗi trong trình biên dịch của tôi không? Tôi đang sử dụng phiên bản g ++ 4.2.1 của Apple. Chỉnh sửa: cũng dường như xảy ra trong các phiên bản sau của g ++.
Cảm ơn sự giúp đỡ của bạn!
Second chỉnh sửa: trình biên dịch của tôi là hạnh phúc nếu tôi sử dụng this->vec.size()
trong test2
thay vì dựa vào những tuyên bố using A::vec
.
[Tại sao tôi phải để truy cập các thành viên lớp cơ sở mẫu thông qua con trỏ này?] (Http://stackoverflow.com/ q/4643074/341970) – Ali