2010-11-29 37 views

回答

6

因爲複製構造函數不能是模板。如果他們只有模板版本,那麼編譯器會產生一個無法正常工作的版本。

相同的作業...我想。

3

非模板版本的原因是允許auto_ptr s被分配/構建相同的類型。模板版本允許從相關但不相同的指針類型構造/分配。

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

繼承是一個使用模板的更好的例子,但它也適用於cv差異。 – 2010-11-29 19:18:06

+0

@Fred,是的,繼承是比較常見的情況,但是不太簡潔的例子。 – Eclipse 2010-11-29 19:19:43

7

它有一個拷貝構造函數 - 非模板之一。

模板的構造函數和賦值操作符允許指針類型的分配對其中隱含的存在:

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; // * 

沒有模板的版本,(*)是行不通的,因爲編譯器將auto_ptr<A>作爲一個完全不同的類型比auto_ptr<B>

4

爲什麼C++ auto_ptr有兩個拷貝構造函數和兩個賦值操作符,但是隻有一個默認構造函數?

它沒有。

它具有1層默認的構造(一個構造函數0參數)

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

它具有1層拷貝構造(構造,使一個拷貝從同一類型的對象)

auto_ptr (auto_ptr& rhs) throw() 

它有1個賦值運算符,用於分配相同類型的對象。

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

它有一個奇特的模板構造函數的auto_ptr其他類型的(這不是一個拷貝構造函數,這只是一個正常的構造(雖然它是模板化))。

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

它還有另外一個賦值操作符是需要不同類型的汽車指針(所以,是的,這是另一個賦值運算符,但它不是一個拷貝賦值運算符(但轉換賦值運算符)作爲RHS有不同的類型) 。

template<class Y> 
auto_ptr& operator= (auto_ptr<Y>& rhs) throw() 
相關問題