我遇到基于for语句的新ranged的问题:
for ( InputReaderObject irb : InputReader )
{
......
}
正如您所看到的,我有一个名为InputReaderObject的类,然后是另一个在包含的头文件中定义为extern的变量。并在此处作为InputReaderObject使用之前被声明。现在,对于实际问题,我的智慧和编译器都在扼杀我
找不到类型为'InputReaderObject *'的可调用'begin'函数。
现在我的怀疑是,在包含的头文件中,它被声明为extern,并且作为InputReaderObject数组(它被声明为数组)实际上不可见。
那么,基于语句的范围是否适用于指针?或者这是我的问题吗?
谢谢
答案 0 :(得分: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循环的任何内容都需要具有返回迭代器的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
类型的指针,那么这可能会导致令人困惑的结果。