5

我有一些用户定义的迭代器,时不时会遇到一个很容易解决的奇怪错误,但我不明白为什么会得到它:

uint8_t bytes[pitch*height];

array_iterator::col_iterator a( &bytes[0] );

array_iterator::row_iterator base_iter_begin(
  array_iterator::col_iterator( &bytes[0] ), width, pitch );

array_iterator::row_iterator base_iter_end(
  array_iterator::col_iterator( &bytes[pitch*height] ), width, pitch
  );

我有一个名为 array_iterator 的类,其中嵌入了 typedefs row_iterator 和 col_iterator。row_iterator 构造函数将 col_iterator 作为其第一个参数。第一个和最后一个语句工作得很好。中间语句编译失败,出现以下错误:

test-2d-iterators.cc:780: error: declaration of 'bytes' as array of references

写 &( bytes[0] ) 并不能解决问题(不足为奇,因为 [] 的优先级高于 &)。当然,我可以将“a”替换为显式 col_iterator 构造函数调用,但为什么必须这样做呢?而且如果有问题,为什么最后一行的col_iterator构造函数编译?

谢谢。

4

1 回答 1

2

首先,我们可以将您的问题缩小到以下几行:

struct row_iterator { ... };
typedef unsigned* col_iterator;
unsigned bytes[5];
row_iterator base_iter_begin(col_iterator(&bytes[0]));

而第三行理解为:

row_iterator base_iter_begin(col_iterator& bytes[0]);

并且这一行声明了一个函数,该函数将一个对 col_iterator 的引用为 0 的数组作为参数并返回一个 int。正如评论中指出的那样,这确实是最令人烦恼的解析案例。

摆脱它的最简单方法是使用复制初始化而不是直接初始化(C++ 中的初始化):

row_iterator base_iter_begin = row_iterator(col_iterator(&bytes[0]));

在你的情况下是:

array_iterator::row_iterator base_iter_begin = array_iterator::row_iterator(array_iterator::col_iterator( &bytes[0] ), width, pitch );

注意:如果你使用的是 C++11,还有更多的初始化规则,你可以使用列表初始化来摆脱样板和最麻烦的解析:

array_iterator::row_iterator base_iter_begin{array_iterator::col_iterator(&bytes[0]), width, pitch};
于 2013-04-26T10:17:46.383 回答