2010-11-29 25 views

Trả lời

6

Vì trình tạo bản sao không thể là mẫu. Nếu họ chỉ có phiên bản mẫu thì trình biên dịch sẽ tạo một phiên bản không hoạt động chính xác.

Tương tự cho chuyển nhượng op ... Tôi nghĩ vậy.

3

Lý do cho các phiên bản không được tạo mẫu là cho phép auto_ptr s cùng loại được chỉ định/xây dựng. Các phiên bản templated tồn tại để cho phép xây dựng/chuyển nhượng từ các loại con trỏ có liên quan, nhưng không giống nhau.

auto_ptr <Foo> f = new Foo(); // uses raw pointer constructor 
auto_ptr <Foo> f2 = f; // uses non-templated constructor 
auto_ptr <const Foo> f3 = f2; // uses templated constructor 

auto_ptr <Foo> f4 = new foo(); 
f2 = f4; // uses non-templated assignment operator 
f3 = f2; // uses templated assignment operator 
+2

Thừa kế tạo ví dụ tốt hơn về cách sử dụng mẫu, nhưng cũng áp dụng cho sự khác biệt cv. –

+0

@Fred, vâng, kế thừa là trường hợp phổ biến hơn, nhưng làm cho một ví dụ ngắn gọn hơn. – Eclipse

+0

Có vẻ như hai thứ đã bị mất trong dòng khai báo f4, ý của bạn là auto_ptr f4 = new Foo()? –

7

Nó có một copy constructor - một trong những phi templated.

Mẫu nhà xây dựng và toán tử gán cho phép chuyển nhượng các loại con trỏ mà một tiềm ẩn tồn tại:

class A {} 
class B : public A {} 

B * b = new B(); 
A * a = b;  // OK! 


auto_ptr<B> b(new B); 
auto_ptr<A> a = b; // * 

mà không có mẫu phiên bản, (*) sẽ không làm việc, như xử lý biên dịch auto_ptr<A> như một hoàn toàn khác nhau nhập hơn auto_ptr<B>.

+1

Không, một phép đúc tĩnh (ví dụ: cho phép chuyển đổi A * sang B *) không được sử dụng. Chuyển đổi ngầm định được sử dụng. –

+0

Tệ của tôi, Fred, và sửa nó. – peterchen

4

Tại sao C++ auto_ptr có hai trình tạo bản sao và hai toán tử gán nhưng một hàm tạo mặc định?

Nó không có.

Nó có 1 constructor mặc định (một constructor mà mất 0 đối số)

explicit auto_ptr (T* ptr = 0) throw() 

Nó có 1 bản constructor (một constructor mà làm cho một bản sao từ một đối tượng cùng loại)

auto_ptr (auto_ptr& rhs) throw() 

Nó có 1 toán tử gán được sử dụng để gán các đối tượng cùng loại.

auto_ptr& operator= (auto_ptr& rhs) throw() 

Nó có hàm tạo khuôn mẫu ưa thích lấy auto_ptr các loại khác (đây không phải là hàm tạo bản sao nó chỉ là một hàm tạo bình thường (mặc dù nó được tạo khuôn mẫu)).

template<class Y> 
auto_ptr (auto_ptr<Y>& rhs) throw() 

Nó có một toán tử gán mà có các loại khác nhau của con trỏ tự động (Vì vậy, có đây là một toán tử gán nhưng nó không phải là một toán tử gán bản sao (nhưng một toán tử gán chuyển đổi) là RHS có một kiểu khác nhau) .

template<class Y> 
auto_ptr& operator= (auto_ptr<Y>& rhs) throw() 
Các vấn đề liên quan