C++ 11 ranged based for 带有指针的语句

Posted

技术标签:

【中文标题】C++ 11 ranged based for 带有指针的语句【英文标题】:C++ 11 ranged based for statements with pointers 【发布时间】:2012-08-10 01:30:33 【问题描述】:

我在使用新的基于范围的 for 语句时遇到问题:

for ( InputReaderObject irb : InputReader )

 ......

如您所见,我有一个名为 InputReaderObject 的类,然后是另一个在包含的头文件中定义为外部变量的变量。并且早在此处用作 InputReaderObject 之前就已声明。现在,对于实际的问题,我的智力和我的编译器都在扼杀我

找不到类型“InputReaderObject *”的可调用“开始”函数。

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

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

谢谢

【问题讨论】:

显示InputReader 的声明会有很大帮助。 【参考方案1】:

如果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 设为引用而不是副本只是一个建议。出于某种原因,您实际上可能需要副本。)

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

【讨论】:

对于在 for-range 语句中工作的数组来说,begin/end 的重载没有必要可见。

以上是关于C++ 11 ranged based for 带有指针的语句的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现26: 如何使用std::for_each以及基于范围的for循环 (since C++11)

C++11:基于范围的 for 语句:“range-init”生命周期?

clang 10 & OpenMP on range-based for error(文档说应该没问题)

c++ 中的 range-for 会调用项目的复制构造函数吗?

C++11-范围for(range for)

OpenCV for iOS 框架错误“Base.hpp”标头必须编译为 C++