use*_*566 5 c++ arrays reference most-vexing-parse
我有一些用户定义的迭代器,偶尔我会得到一个很容易解决的奇怪错误,但我不明白为什么我会得到它:
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
);
Run Code Online (Sandbox Code Playgroud)
我有一个名为array_iterator的类,嵌入了typedefs row_iterator和col_iterator.row_iterator构造函数将col_iterator作为其第一个参数.第一个和最后一个语句工作正常.中间语句无法编译,并出现以下错误:
test-2d-iterators.cc:780: error: declaration of 'bytes' as array of references
Run Code Online (Sandbox Code Playgroud)
写入&(字节[0])并不能解决问题(不出所料,因为[]的优先级高于&).当然,我可以用"a"代替显式col_iterator构造函数调用,但为什么我必须这样做?如果有问题,为什么最后一行中的col_iterator构造函数会编译?
谢谢.
首先,我们可以将您的问题缩小到以下几行:
struct row_iterator { ... };
typedef unsigned* col_iterator;
unsigned bytes[5];
row_iterator base_iter_begin(col_iterator(&bytes[0]));
Run Code Online (Sandbox Code Playgroud)
第三行理解为:
row_iterator base_iter_begin(col_iterator& bytes[0]);
Run Code Online (Sandbox Code Playgroud)
其中一行声明了一个函数,该函数将包含 0 个对 col_iterator 的引用的数组作为参数并返回一个 int。正如评论中指出的那样,这确实是最令人烦恼的解析情况。
摆脱它的最简单方法是使用复制初始化而不是直接初始化(C++ 中的初始化):
row_iterator base_iter_begin = row_iterator(col_iterator(&bytes[0]));
Run Code Online (Sandbox Code Playgroud)
在你的情况下是:
array_iterator::row_iterator base_iter_begin = array_iterator::row_iterator(array_iterator::col_iterator( &bytes[0] ), width, pitch );
Run Code Online (Sandbox Code Playgroud)
注意:如果您使用的是 C++11,则还有更多初始化规则,并且您可以使用列表初始化来摆脱样板文件和最令人烦恼的解析:
array_iterator::row_iterator base_iter_begin{array_iterator::col_iterator(&bytes[0]), width, pitch};
Run Code Online (Sandbox Code Playgroud)