0

我对新的基于范围的 for 语句有疑问:

for ( InputReaderObject irb : InputReader )
{
 ......
}

如您所见,我有一个名为 InputReaderObject 的类,然后是另一个在包含的头文件中定义为 extern 的变量。并且早在此处用作 InputReaderObject 之前就已声明。现在,对于实际问题,我的智能和我的编译器都在扼杀我

找不到类型“InputReaderObject *”的可调用“开始”函数。

现在我怀疑的是,在包含的头文件中,它被声明为外部,并且作为 InputReaderObject 的数组并不真正可见(它被声明为数组)。

那么,基于范围的 for 语句是否适用于指针?还是这是我的问题?

谢谢你

4

1 回答 1

5

如果InputReader在头文件中声明为一个恒定大小的数组,那么它应该与您#include <array>#include <iterator>其他几个库头中的任何一个一样工作,以便您获得声明

template<typename T, std::size_t N> T* std::begin(T (&array)[N]);
template<typename T, std::size_t N> T* std::end(T (&array)[N]);

但是如果InputReader声明类似

extern InputReaderObject* InputReader;

或许

extern InputReaderObject InputReader[];

...?从数组中有多少对象并不明显,但我们假设同一个标题也有类似的东西:

extern unsigned int InputReaderSize;

您传递到基于范围的 for 循环中的任何内容都需要具有返回迭代器的函数beginend(函数可以是类成员,通过依赖于参数的查找找到,或者在namespace std.)标准库为实际数组和标准容器定义了一些beginend函数,但您可以通过定义自己的来扩展它:

#include <iterator>

struct InputReaderLoopType {
    InputReaderObject* begin() const { return InputReader; }
    InputReaderObject* end() const { return InputReader + InputReaderSize; }
};
extern const InputReaderLoopType InputReaderLoop;

会让你做...

for ( InputReaderObject& irb : InputReaderLoop )

irb提供参考而不是副本只是一个建议。出于某种原因,您实际上可能需要副本。)

您还可以定义InputReaderObject* begin(InputReaderObject*);并且InputReaderObject* end(InputReaderObject*);如果您真的希望循环InputReader像已经声明的那样使用。但是,如果有人有一个实际上不是那种类型的指针,那可能会导致令人困惑的结果InputReader

于 2012-08-10T01:49:08.430 回答