派生クラスFoo<T>
へのスマートポインタのベクトルを持つクラスがあります。メンバー関数Shape
を実装しようとしています。at(index)
これが私が直感的に行うことです:
Foo<float> myfoo;
std::unique_ptr<Shape<float>> shape_ptr = myfoo.at(i);
shape_ptr->doSomething(param1, param2, ...);
関数を定義するとat(index)
、コンパイラエラーメッセージが表示されます。移動コンストラクターが定義されており、Shape基本クラスが抽象であることに注意してください。以下に、説明のためにいくつかのコードを示します。
さらに、最近Webで、を使用して代入演算子をオーバーロードする方法の例を見つけましたstd::move
。私は通常、コピースワップのイディオムに従います。上記の演算子をオーバーロードするためのこれらの2つの方法のどちらが、私の場合に意味がありますか?以下に、関数の定義も示します。
template < typename T >
class Foo{
public:
Foo();
Foo( Foo && );
~Foo();
void swap(Foo<T> &);
//Foo<T> & operator =( Foo<T> );
Foo<T> & operator =( Foo<T> && );
std::unique_ptr<Shape<T> > at ( int ) const; // error here!
int size() const;
private:
std::vector< std::unique_ptr<Shape<T> > > m_Bank;
};
template < typename T >
Foo<T>::Foo( Foo && other)
:m_Bank(std::move(other.m_Bank))
{
}
/*template < typename T >
void Filterbank<T>::swap(Filterbank<T> & refBank ){
using std::swap;
swap(m_Bank, refBank.m_Bank);
}
template < typename T >
Foo<T> & Filterbank<T>::operator =( Foo<T> bank ){
bank.swap(*this);
return (*this);
}*/
template < typename T >
Foo<T> & Foo<T>::operator =( Foo<T> && bank ){
//bank.swap(*this);
m_Bank = std::move(bank.m_Bank);
return (*this);
}
template < typename T >
std::unique_ptr<Shape<T> > Foo<T>::at( int index ) const{
return m_Bank[index]; // Error here! => error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
}