C ++ 11基于带指针的语句

时间:2012-08-10 01:30:34

标签: c++ pointers for-loop c++11 range

我遇到基于for语句的新ranged的问题:

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

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

找不到类型为'InputReaderObject *'的可调用'begin'函数。

现在我的怀疑是,在包含的头文件中,它被声明为extern,并且作为InputReaderObject数组(它被声明为数组)实际上不可见。

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

谢谢

1 个答案:

答案 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循环的任何内容都需要具有返回迭代器的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类型的指针,那么这可能会导致令人困惑的结果。