2012-03-21 175 views
1

大家好,能告訴我爲什麼VS2010會給我一個這段代碼的錯誤,我看不出有什麼問題?有關std :: transform的疑惑 - 將std :: map的value_type :: second轉換爲std :: vector

錯誤代碼:錯誤C2679:二進制「=」:沒有操作員發現這需要類型的右邊的操作數「的std ::矢量< _Ty>」(或沒有可接受的轉化率)

// Elements container 
typedef std::vector<CFVFElementPtr> ElementArray; 
typedef std::map<CVertexSemantic::Type, ElementArray> ElementsMap; 

// Create an empty array of elements 
ElementsMap::value_type::second_type allElements; 

// Concatinate each std::vector found within the map 
std::transform(m_elementsMap.begin(), m_elementsMap.end(), 
std::insert_iterator<ElementArray>(allElements, allElements.end()), 
select2nd<ElementsMap::value_type>()); 

所有我試圖做的是

for (auto i = m_elementsMap.begin(); i != m_elementsMap.end(); ++i) 
{ 
    const ElementArray& elements = (*i).second; 
    allElements.insert(allElements.end(), elements.begin(), elements.end()); 
} 

至於巴勃羅的迴應,我想創造一個接受的ElementArray數組的自定義迭代器,但現在我得到錯誤的水桶負荷。

template < class Container > 
class container_insert_interator 
{ 
public: 
    typedef container_insert_interator<Container> this_type; 
    typedef Container container_type; 
    typedef typename Container::const_reference const_reference; 
    typedef typename Container::value_type valty; 

    explicit container_insert_interator (Container& cont, typename Container::iterator iter) 
      : container(&cont), iter(iter) 
    { } 

    this_type& operator = (typename const_reference value) 
    { 
     iter = container->insert(iter, std::begin(value), std::end(value)); 
     ++iter; 
     return *this; 
    } 

    this_type& operator*() 
    { 
     return *this; 
    } 

    this_type& operator++() 
    { 
      return *this; 
    } 

    this_type operator++ (int) 
    { 
     return *this; 
    } 

protected: 
    Container* container; // pointer to container 
    typename Container::iterator iter ; // iterator into container 
}; 
+0

櫃面你想知道什麼[select2nd](http://www.sgi.com /tech/stl/select2nd.html),它只是返回std :: map 。第二個std :: map的value_type。 – Sent1nel 2012-03-21 02:11:03

回答

1

問題是ElementsMap::value_type::second_typeElementArray。也就是說,您試圖將ElementArray的實例插入到ElementArray中,該實例確實擁有CFVFElementPtr的實例。

更新:從

this_type& operator = (typename const_reference value) 

改變你的operator=聲明

template<typename OtherContainer> 
this_type& operator = (OtherContainer const& value) 

幾乎工作。除了VS 2010或GCC 4.6.1都不提供返回迭代器的vector::insert重載。如果你想讓你的範圍插入返回一個迭代器來代替iter,你可能需要一個更新的編譯器。

更改執行在年底operator=始終插入,即

container->insert(container->end(), std::begin(value), std::end(value)); 

編譯罰款與GCC 4.6.1(當然,你可以刪除對iter所有引用您的迭代器類)。

+0

我嘗試創建自己的接受'ElementArray'的迭代器,它仍然不起作用。 – Sent1nel 2012-03-21 03:23:59

+0

使用'template this_type&operator =(OtherContainer const&value)'比我在下面發佈的版本更通用,因爲它允許任何STL容器類型,所以我會接受你的答案。 – Sent1nel 2012-03-21 16:01:42

0

我找到了答案,該問題與我的自定義迭代器。正確的一個工程是

template < class Container > 
class container_back_insert_interator 
{ 
public: 
    typedef container_back_insert_interator<Container> this_type; 
    typedef Container container_type; 
    typedef typename container_type::const_reference const_reference; 
    typedef typename container_type::value_type valty; 

    explicit container_back_insert_interator (container_type& cont) 
    : container(&cont) 
    { } 

    this_type& operator = (const_reference value) 
    { 
     container->insert(container->end(), std::begin(value), std::end(value)); 
     return *this; 
    } 

    this_type& operator*() 
    { 
     return *this; 
    } 

    this_type& operator++() 
    { 
     return *this; 
    } 

    this_type operator++ (int) 
    { 
     return *this; 
    } 

protected: 
    container_type* container; // pointer to container 
}; 

template < class Container > 
inline container_back_insert_interator<Container> container_back_inserter(Container& cont) 
{ 
    return container_back_insert_interator<Container>(cont); 
} 

不過,我必須提醒的是,如果你在Visual Studio 2010中使用此,你將必須實現一個std SGI形式::變換。由於某種原因,VS2010隨附的版本會引發大量錯誤,所有錯誤均在<xutility>標題內。

This std::transform works just fine。

1

您可以考慮使用一個仿函數,可以添加元素,您的目標陣列std::for_each一起散步地圖:

struct ElementArray_appender 
{ 
    ElementArray_appender(ElementArray& dest_) : dest(dest_) { 
    }; 

    void operator()(ElementsMap::value_type const& map_item) { 
     ElementArray const& vec(map_item.second); 

     dest.insert(dest.end(), vec.begin(), vec.end()); 
    }; 

private: 
    ElementArray& dest; 
}; 



// in whatever function: 

std::for_each(m_elementsMap.begin(), m_elementsMap.end(), ElementArray_appender(allElements)); 
相關問題