繁体   English   中英

为什么箭头操作符“ - >”不能用于boost :: numeric :: ublas :: vector <...> :: iterator?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM