[英]Why doesn't the arrow operator “->” work on boost::numeric::ublas::vector<…>::iterator?
考虑以下代码:
struct CData
{
int bar() { return 1; }
};
int main()
{
typedef boost::numeric::ublas::vector<CData> vec_data_t;
vec_data_t foo;
for (vec_data_t::iterator it = foo.begin();
it != foo.end();
++it)
{
std::cout << it->bar() << std::endl; // COMPILE ERROR!
std::cout << (*it).bar() << std::endl; // ok
}
return 0;
}
为什么使用箭头操作符的循环中的第一行无法编译,而使用operator *的下一行工作正常? 我习惯使用带有std容器迭代器的箭头操作符,并想知道为什么它失败了boost :: numeric :: ublas迭代器。
我正在使用boost 1.54和gcc 4.9.1,确切的错误信息是:
error: base operand of ‘->’ has non-pointer type ‘boost::numeric::ublas::vector<CData>::iterator’
我说这是Boost中的一个错误。 根据文档, boost::numeric::ublas::vector
一个Vector Expression提供了一个模型,它提供了一个Indexed Bidirectional迭代器 ,除其他外,它将以下内容列为有效表达式及其语义:
会员访问|
it->m
| 类型要求T
是定义tm
的类型。
会员访问|
it->m
| 前提是it
是可解除引用的。 | 语义等同于(*it).m
查看代码显示indexed_iterator
类模板未定义operator->
。 根据文件,它显然应该。
您可能想要查找错误报告,如果没有,请提交文件。
因为operator->()
是一个非常难以实现的操作符。
我见过的任何非平凡的自定义迭代器都没有实现->
。 我的猜测是,uBlas实现者不知道该怎么做(我不怪他们)。
问题当然是保证在->
链的末尾有一个指针,并且在it->bla
顶部 - it->bla
与(*it).bla
具有相同的含义(*it).bla
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.