考虑以下代码:
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’
答案 0 :(得分:3)
我说这是Boost中的一个错误。根据文档,boost::numeric::ublas::vector
模拟Vector Expression,它提供Indexed Bidirectional iterator,其中(除其他外)将以下内容列为有效表达式及其语义:
会员访问|
it->m
| 类型要求T
是定义t.m
的类型。
会员访问|
it->m
| 前置条件it
可以取消引用。 | 语义等同于(*it).m
查看代码显示indexed_iterator
类模板未定义operator->
。根据文件,它显然应该。
您可能想要查找错误报告,如果没有,请提交文件。
答案 1 :(得分:0)
因为operator->()
是一个非常难以实现的操作员。
我见过的任何非平凡的自定义迭代器都没有实现->
。
我的猜测是,uBlas实现者不知道该怎么做(我不怪他们)。
问题当然是要保证->
链的末尾有一个指针,而it->bla
的指针与(*it).bla
具有相同的含义< / p>