2013-03-23 25 views
9

tác dụng thực tế của các cấu trúc sau là gì:Ảnh hưởng của một lớp cơ sở const

class Base { /* ... */ }; 

template<class T> 
class Derived : public T { /* ... */ }; 

int main() { 
    Derived<const Base> d; 
    // ... 
} 

Có lớp Derived chỉ có quyền truy cập vào các const -part của giao diện của Base? Thử nghiệm đầu tiên của tôi cho thấy rằng thực sự không có tác dụng gì cả. Tại sao?

Cảm ơn!

+0

Tôi nghĩ, câu trả lời là ở đây: http://stackoverflow.com/a/13435319/945183 –

+0

Tôi nghĩ những câu hỏi này đề cập đến những thứ khác nhau: Các câu hỏi được liên kết là về mẫu * khai báo * của form 'template struct test;' và câu hỏi của tôi là về template * instantiations * có tham số được áp dụng là các kiểu 'const'. – phlipsy

Trả lời

2

tôi đoán là const bị bỏ qua, bởi vì nếu bạn cố gắng viết

class Derived : public const Base 

chương trình doesn't compile.

EDIT:

frozenkoi cho phần liên quan của tiêu chuẩn trong các ý kiến:

"Một typedef-name (7.1.3) mà tên một kiểu lớp, hoặc một CV- phiên bản đủ điều kiện của nó, cũng là một tên lớp.Nếu một typedef-tên mà tên một loại lớp đủ điều kiện cv được sử dụng, nơi một tên lớp là bắt buộc, các vòng loại cv được bỏ qua.Một typedef-name sẽ không được sử dụng như số nhận dạng trong một lớp học. " §9.1

+0

Bạn nói đúng, bạn không thể viết rõ ràng. Tôi đoán nó giống như 'void func() {return void(); } '- viết nó một cách rõ ràng nó hoàn toàn vô dụng nhưng trong bối cảnh các khuôn mẫu quan trọng như một trường hợp góc. – phlipsy

+0

Tôi nghĩ rằng nó có nhiều việc phải làm với 'const' bị bỏ qua khi khai báo kiểu hơn là bị bỏ qua trong khai báo lớp. (không có tiêu chuẩn C++ trong tay) nhưng theo các dòng này: "Các vòng loại cv cấp cao nhất trên tham số mẫu bị bỏ qua khi xác định loại" §14 – frozenkoi

+1

Tôi không bị thuyết phục vì đó chỉ là vấn đề cú pháp; biên dịch này: http://ideone.com/ik41t3 –

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