2012-08-10 56 views
0

我有一个问题陈述了新的远程基于对声明:C++ 11不等基于与指针

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

因此,大家可以看到,我有一个名为InputReaderObject类,然后另一个变量被定义为包含头文件中的外部。并且在此之前被声明为InputReaderObject。现在,对于实际问题,我的intellisence和我的编译器都在扼杀我

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

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

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

谢谢

+2

显示'InputReader'的声明会有很大帮助。 – 2012-08-10 03:49:51

回答

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; 

任何你传递到范围为基础的循环需要有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的参考,而不是副本,只是一个建议,你可能真的需要复制的某些原因。)

如果您确实希望循环与InputReader一起工作,您也可以定义InputReaderObject* begin(InputReaderObject*);InputReaderObject* end(InputReaderObject*);。但是如果有人有一个不是InputReader的类型的指针,那可能会导致令人困惑的结果。

+1

对于数组在“范围”语句中工作的情况,“begin' /'end'的重载不是必需的。 – 2012-08-10 03:46:48