我有一个Visual Studio 2013 C ++ 11项目,我试图定义一个迭代器。我希望迭代器取消引用一个对象,但在内部它实际上迭代了对象构造所需的一些内部数据。
class my_obj
{
public:
my_obj(some_internal_initialization_value_ v);
std::wstring friendly_name() const;
// ...
};
class my_iterator
: public boost::iterator_facade<
my_iterator,
my_obj,
boost::forward_traversal_tag>
{
// ...
private:
my_obj& dereference() const
{
// warning C4172: returning address of local variable or temporary
return my_obj(some_internal_initialization_value_);
}
};
int main( int argc, char* argv[])
{
my_container c;
for (auto o = c.begin(); o != c.end(); ++o)
printf( "%s\n", o->friendly_name().c_str() );
}
这些内部值对用户来说是不重要的实现细节,我不想暴露它们。如何编写正确执行此操作的迭代器?另一种方法是我必须做这样的事情:
my_container c;
for (auto i = c.begin(); i != c.end(); ++i)
{
my_obj o(*i);
printf( "%s\n", o.friendly_name().c_str() );
}
答案 0 :(得分:0)
在iterator_facade的boost页面中,模板参数为:derived iterator,value_type,category, reference type ,difference_type。 Ergo,只是告诉它引用不是引用
class my_iterator
: public boost::iterator_facade<
my_iterator,
my_obj,
boost::forward_traversal_tag,
my_obj> //dereference returns "my_obj" not "my_obj&"