命名空间 'std' 中没有名为'size'的成员。

4

我正在尝试将一些C++代码从Windows移植到OS X(使用Xcode)。

以下是代码:

writePosition %= std::size(bufferL);

出现错误:

命名空间'std'中没有名为'size'的成员

我该如何解决这个问题?


1
你是不是想使用 std::size_tbufferL 是什么类型? - R Sahu
你是指 sizeof 还是 size_t - Tas
4
好的,我会尽力完成翻译工作。以下是需要翻译的内容:For everybody's reference: https://en.cppreference.com/w/cpp/iterator/size - user2486888
2
你需要编译为C++17或更高版本。 - Cheers and hth. - Alf
也许您忘记了包含 <iterator> - 没有 [mcve],无法确定。 - Toby Speight
3个回答

12

std::size()自C++17开始可用。请尝试为您的编译器启用-std=c++17

此外,请确保源文件包含#include <iterator>,直接或间接通过#include以下任何一个头文件来包含:

  • <array>
  • <deque>
  • <forward_list>
  • <list>
  • <map>
  • <regex>
  • <set>
  • <string>
  • <string_view>
  • <unordered_map>
  • <unordered_set>
  • <vector>

2
从cppreference获取的信息显示,std::size接受两种类型的参数:具有名为size()的方法的容器(来自STL或用户定义)和固定大小的数组。
你应该检查bufferL是否是其中之一。
此外,如果bufferL是固定大小的数组,并且您没有包含任何包含STL容器的头文件,则必须包括iterator头文件。

2
虽然你说的大部分是正确的,但它们大多数并没有回答 OP 实际提出的问题,即为什么无论传递什么参数给 std::size,编译器都无法识别它。你回答中唯一与问题相关的部分是 "你必须包含 iterator 头文件". - Remy Lebeau

2
要使用 std::size ,您需要确保包含#include <iterator>。另一件事是检查编译器是否支持C++17。此功能仅适用于符合C++17标准的编译器。
将IDE中的编译器设置更改为支持C++17的编译器。

2
这并没有回答问题。如果 bufferL 的类型不同,你会得到 no matching function to call,而不是 OP 得到的结果。提供的两个链接在这种情况下都没什么帮助。 - Bartek Banachewicz
我试图解释“size”的作用以及为什么它对他可能无效。这些链接提供了他可以尝试的替代解决方案。如果我弄错了,请指正我。 - Shrikanth N
1
我相信我刚刚做到了。 - Bartek Banachewicz
1
@ShrikanthN解释std::size的作用并不回答OP关于为什么编译器未知std::size的实际问题。你的回答中没有任何内容回答该问题。使用size_t与解决此问题无关。而且,使用sizeof()作为替代方案就是错误的,它不能用于获取容器的size,只能用于固定数组,即使是这样,您也必须记住将数组的大小除以元素类型的大小才能获得正确的size值。 - Remy Lebeau
@RemyLebeau @Bartek Banachewicz - 感谢您们的指导。我已经修改了我的回答,希望现在更有帮助。 - Shrikanth N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接