gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:26:07 24 4
gpt4 key购买 nike

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

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

如您所见,我有一个名为 InputReaderObject 的类,然后是另一个在包含的头文件中定义为外部变量的变量。并且在此处用作 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[];

...?从数组中有多少对象并不明显,但我们假设相同的 header 也有类似的内容:

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++ 11 范围基于带指针的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com