gpt4 book ai didi

c++ - 使用 unique_ptr 映射变换迭代器

转载 作者:行者123 更新时间:2023-11-28 03:15:46 25 4
gpt4 key购买 nike

我有一个 Holder应仅公开其映射值的类。我使用了一个转换迭代器来这样做。如果我使用指向类型 (ClassA*) 的普通指针但不使用 unique_ptr,它会起作用。我将以下示例基于此代码: transform_iterator compile problem

我收到以下错误(源自 begin() 函数),这让我认为有人试图复制该对而不是使用引用。

提前致谢

error C2248:
'std::unique_ptr<ClassA,std::default_delete<_Ty>>::unique_ptr' :
cannot access private member declared in class
'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;
}
}

最佳答案

问题是 get_value引用pair<K,V> ,但正在传递对 map 值类型的引用,pair<const K,V> .这需要进行转换,这需要将键和值都复制到一个新的对中。你得到错误是因为 unique_ptr不可复制。

解决方案 1:更改 get_value接受对 pair<const K,V> 的引用匹配TMap::value_type .这允许该函数直接接受对 map 值的引用。

解决方案 2:实例化 get_value对于 const int而不是 int ;这将与解决方案 1 具有相同的效果。

解决方案 3:实例化 get_value对于 const unique_ptr &而不是 unique_ptr ,所以它需要一对包含对 map 值的引用。无需复制 unique_ptr 即可创建此临时对.

关于c++ - 使用 unique_ptr 映射变换迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com