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