4

考虑这段代码:

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’
4

2 回答 2

3

我会说这是Boost中的一个错误。根据文档,对Vector Expressionboost::numeric::ublas::vector建模,它提供Indexed Bidirectional iterator,它(除其他外)将以下内容列为有效表达式及其语义:

会员访问 | it->m| 类型要求 T是为其t.m定义的类型。


会员访问 | it->m| 前提条件 it是可取消引用的。| 语义等价于(*it).m

查看代码显示indexed_iterator类模板没有定义operator->. 根据文档,它显然应该。

您可能想查找错误报告,如果没有,请提交一份。

于 2014-10-20T09:41:38.457 回答
0

因为operator->()是一个极难实施对的算子。

我见过的任何重要的自定义迭代器都没有实现->. 我的猜测是 uBlas 的实施者不知道该怎么做(我不怪他们)。

问题当然是要保证在->链的末端有一个指针,并且在它的顶部it->bla具有相同的含义(*it).bla

于 2017-05-13T01:34:13.837 回答