我有一個類,其中一個std::unique_ptr
作爲類成員。我想知道,如何正確定義複製構造函數,因爲我收到以下編譯器錯誤消息:error C2248: std::unique_ptr<_Ty>::unique_ptr : cannot access private member declared in class 'std::unique_ptr<_Ty>
。我的一流的設計看起來像:複製構造函數與智能指針
template <typename T>
class Foo{
public:
Foo(){};
Foo(Bar<T> *, int);
Foo(const Foo<T> &);
~Foo(){};
void swap(Foo<T> &);
Foo<T> operator = (Foo<T>);
private:
std::unique_ptr<Bar> m_ptrBar;
int m_Param1;
};
template < typename T >
Foo<T>::Foo(const Foo<T> & refFoo)
:m_ptrBar(refFoo.m_ptrBar),
m_Param1(refFoo.m_Param1)
{
// error here!
}
template < typename T >
void Foo<T>::swap(Foo<T> & refFoo){
using std::swap;
swap(m_ptrBar, refFoo.m_ptrBar);
swap(m_Param1, refFoo.m_Param1);
}
template < typename T >
Foo<T> Foo<T>::operator = (Foo<T> Elem){
Elem.swap(*this);
return (*this);
}
@ Cubbi,謝謝。我現在有另一個問題。 Bar類實際上是一個抽象基類,因此我得到一個新的錯誤信息:'error C2259:'Bar':不能實例化抽象類',除了將抽象基類轉換爲一個簡單的基類? – Tin
@Tin:在這種情況下,您需要爲基類添加一個純虛擬'clone()'函數,並在每個派生類中重寫以使用'new'創建一個副本。然後初始化者變成'bar(foo.bar?foo.bar-> clone():nullptr)'。 –
@Tin C++ FAQ調用[「虛構構造函數」](http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8) – Cubbi