箭头操作符为什么不是“ - >”在boost :: numeric :: ublas :: vector< ...> :: iterator上工作?

时间:2014-10-20 09:22:36

标签: c++ boost boost-ublas

考虑以下代码:

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’

2 个答案:

答案 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>