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

Posted

技术标签:

【中文标题】命名空间“std”中没有名为“size”的成员【英文标题】:No member named 'size' in namespace 'std' 【发布时间】:2018-07-26 04:56:27 【问题描述】:

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

以下代码:

writePosition %= std::size(bufferL);

正在生成错误:

我该如何解决这个问题?

【问题讨论】:

您的意思是使用std::size_t 吗? bufferL是什么类型的? 您的意思是sizeof 还是size_t 供大家参考:en.cppreference.com/w/cpp/iterator/size 您需要编译为C++17或更高版本。 也许你忘了包含<iterator> - 没有minimal reproducible example,这是不可能的。 【参考方案1】:

std::size() 可用starting from C++17。尝试为您的编译器启用-std=c++17

另外,请仔细检查源文件是否包含#include <iterator>,直接或间接通过#include'ing 以下任何标头:

<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 头文件。

【讨论】:

虽然你说的是真的,但大部分都没有解决 OP 的实际问题,即为什么编译器不知道 std::size,不管传递给它的是什么。与问题相关的唯一部分答案是“您必须包含 iterator 头文件”。【参考方案3】:

为了能够使用std::size,您必须确保包含#include <iterator>。您必须检查的另一件事是编译器支持 C++17。此功能仅适用于符合 C++17 标准的编译器。

将 IDE 中的编译器设置更改为支持 C++17 的编译器。

【讨论】:

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

以上是关于命名空间“std”中没有名为“size”的成员的主要内容,如果未能解决你的问题,请参考以下文章

命名空间“std”中没有名为“make_unique”的成员

命名空间“std”中没有名为“shared_ptr”的类型

错误:命名空间“std”中没有名为“remove_cv_t”的模板;你是说'remove_cv'吗?

错误:命名空间“std”中没有名为“enable_if_t”的模板;你是说'enable_if'吗?

Vscode/ESP-IDF 错误命名空间“std”没有成员“array”无论如何都会编译

命名空间 boost::detail (SALOME 7.3.0) 中没有名为“dynamic_cast_tag”的成员