Holder
マップの値のみを公開するクラスがあります。そのために変換イテレータを使用しました。型 (ClassA*) への単純なポインターを使用しても機能しますが、unique_ptr では機能しません。このコードに基づいて次の例を作成しました:
transform_iterator compile problem
次のエラー (begin()
関数に由来する) が表示されます。これは、誰かが参照を使用する代わりにペアをコピーしようとしていると思われます。
前もって感謝します
エラー C2248:
'std::unique_ptr<ClassA,std::default_delete<_Ty>>::unique_ptr
':クラス ' '
で宣言されたプライベート メンバーにアクセスできませんstd::unique_ptr<ClassA,std::default_delete<_Ty>>
#include <iostream>
#include <map>
#include <functional>
#include <memory>
#include <string>
#include <boost/iterator/transform_iterator.hpp>
struct ClassA
{
ClassA( const std::string& strName ) : m_strName( strName ) {}
std::string m_strName;
};
template <typename K, typename V>
const V & get_value(std::pair<K, V> const & p) { return p.second; }
class Holder
{
typedef std::map<int, std::unique_ptr< ClassA > > TMap;
typedef std::unique_ptr< ClassA > UniqueA;
TMap m_Map;
public:
Holder()
{
UniqueA a( new ClassA( "#2# ") );
UniqueA b( new ClassA( "#3# ") );
UniqueA c( new ClassA( "#4# ") );
m_Map.insert( std::make_pair( 2, std::move( a ) ) );
m_Map.insert( std::make_pair( 3, std::move( b ) ) );
m_Map.insert( std::make_pair( 4, std::move( c ) ) );
}
typedef std::function< const TMap::mapped_type & (const TMap::value_type &) > F;
typedef boost::transform_iterator<F, TMap::iterator> transform_iterator;
transform_iterator begin()
{
return boost::make_transform_iterator(m_Map.begin(), &get_value< int, std::unique_ptr< ClassA > >);
}
transform_iterator end()
{
return boost::make_transform_iterator(m_Map.end(), &get_value< int, std::unique_ptr< ClassA > >);
}
};
void MyTest()
{
Holder bla;
auto s_beg = bla.begin();
auto s_end = bla.end();
for( auto t=s_beg; t!=s_end;++t) {
std::cout << ( *t )->m_strName << std::endl;
}
}