我有一個Holder
類應該只暴露其地圖的值。我使用了一個轉換迭代器來做到這一點。如果我使用普通指針指向類型(ClassA *),但不使用unique_ptr,則它可以工作。我在此基礎上的代碼下面的例子: transform_iterator compile problem轉換迭代器與unique_ptr的地圖
,我發現了以下錯誤(原產於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;
}
}
在哪一行報告錯誤? –