[英]Templated Class “Copy Constructor”
我遇到了下面部分顯示的這種模板化的智能指針類Cptr,但我不了解其中一種方法的實現,希望獲得一些輸入。 我的問題是關於“方法2”的,標簽如下。 具體來說,如果Cptr由T進行模板化,則可以使用哪種調用語法來調用“方法2”,至少在我看來,該方法似乎是復制構造函數,但我認為復制構造函數沒有模板化。
template <class T> class Cptr
{
public:
/* Constructors ... */
/* Getters ... */
T* ptr() const { return p_; }
long* cnt() const { return cnt_; }
/* Copy Constructors? */
//Method 1
Cptr<T>(const Cptr<T>& i)
: ptr_(i.ptr()), cnt_(i.ptr())
{
std::cout << "M1" << std::endl;
++(*cnt);
}
//Method 2
template <class S> Cptr(const Cptr<S>& i)
: ptr_(i.get()), cnt_(i.cnt())
{
std::cout << "M2" << std::endl;
++(*cnt_);
}
private:
T* p_;
int* cnt_;
};
int main(int argc, char* argv[])
{
CPtr<int> A(new int(5));
CPtr<int> B(A);
std::cout << *(B.get()) << std::endl;
return EXIT_SUCCESS;
}
我設想了對方法2的調用,如下所示:
Cptr<float> B( new float(1.1) );
Cptr<int> A(B); //error for different types
但是對我來說,分配不同類型的指針沒有多大意義。 有誰遇到過像“方法2”這樣的方法定義,如果有的話,有什么用? 非常感謝你花時間陪伴。
首先,松散地說,復制構造函數當然可以是模板。 從技術上講,復制構造函數是同一個類的另一個實例的構造函數,但是您當然可以定義一個將對另一個類的引用作為參數的構造函數。
但是,您的主要方法的答案是,只要允許隱式類型轉換,“ Method2”就可以將智能指針從智能指針分配給其他類:
class Base {};
class Derived : public Base {};
Cptr<Derived> d;
Cptr<Base> b=d; // "Method2" will be used here.
該智能指針實現允許將指向派生類的智能指針分配給指向基類的智能指針。
通常, Cptr<Base>
和Cptr<Derived>
是兩個完全不相關的類。 每個模板實例都是一個單獨的類。 而且,除非可以進行適當的轉換,否則通常不能將一個類的實例分配給完全不相關的類的實例。
就像可以將派生類的普通指針分配給基類的指針一樣,此智能指針提供了可比的功能。
首先,你是對的。 復制構造函數不能是模板。 §12.8/ 2說(我自己強調):
如果類
X
非模板構造函數的第一個參數為X&
,const X&
,volatile X&
或const volatile X&
,並且沒有其他參數,或者所有其他參數都有默認參數,則為復制構造const X&
。 ]
但是方法2不是復制構造函數,因為Cptr<S>
是與Cptr<T>
不同的類 。 它只是一個普通的構造函數,與Cptr(int i)
或Cptr(std::string const& s)
沒有太大不同。 普通的構造函數可以是模板。
當然,您可以假定Cptr<U>
與Cptr<T>
具有相同的成員。 這就是構造函數的實現。 例如,如果Cptr
專門用於該U
而這些成員不存在,那將是行不通的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.