2013-06-04 86 views
0

我有一個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; 
    } 
} 
+0

在哪一行報告錯誤? –

回答

2

的問題是,get_value聲明參考pair<K,V>,但正在傳遞對地圖值類型的引用,pair<const K,V>。這需要轉換,這需要將密鑰和值複製到一個新對中。你得到錯誤,因爲unique_ptr不能被複制。

解決方案1:更改get_value接受對pair<const K,V>的引用以匹配TMap::value_type。這允許函數直接接受對地圖值的引用。

解決方案2:實例化get_value對於const int而不是int;這將與解決方案1具有相同的效果。

解決方案3:實例化get_valueconst unique_ptr &而不是unique_ptr,以便它採用一對包含對映射值的引用。這個臨時對可以在不復制unique_ptr的情況下創建。

+0

解決方案1工作(我沒有檢查其他人)!謝謝你救了我的一天。 –