我对基于范围的新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循环的任何内容都需要具有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类型,则可能导致混淆的结果。

关于c++ - C++ 11范围基于带指针的语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11894299/

10-11 10:51