簡體   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