我对基于范围的新for语句有疑问:
for ( InputReaderObject irb : InputReader )
{
......
}
如您所见,我有一个名为InputReaderObject的类,然后是另一个变量,该变量在包含的头文件中定义为extern。并在此之前用作InputReaderObject进行声明。现在,对于实际问题,我的才智和编译器都在扼杀我
找不到类型为“ InputReaderObject *”的可调用“开始”函数。
现在我怀疑的是,在包含的头文件中,它被声明为extern,并且实际上不是作为InputReaderObject的数组可见(它被声明为数组)。
那么,基于范围的for语句是否可以与指针一起使用?还是这是我的问题?
谢谢
最佳答案
如果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循环的任何内容都需要具有
begin
和end
函数,这些函数返回迭代器。 (这些函数可以是类成员,可以通过依赖于参数的查找或在namespace std
中找到。)标准库为实际数组和标准容器定义了一些begin
和end
函数,但是您可以通过定义自己的函数来扩展它拥有:#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
类型,则可能导致混淆的结果。关于c++ - C++ 11范围基于带指针的语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11894299/