c++ - 无法在一个程序中使用 std::size()
问题描述
我正在使用数组。因此,要找到数组的大小,我需要使用 std::size(),它在一个程序中运行良好,但在另一个程序中无法运行。
有效的程序:
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
int array[]{ 30, 50, 20, 10, 40};
std::sort(std::begin(array), std::end(array));
for (int i{0}; i < static_cast<int>(std::size(array)); ++i)
{
std::cout << array[i] << '\t';
}
std::cout << '\n';
return 0;
}
输出:
10 20 30 40 50
不起作用的程序:
#include <iostream>
#include <iterator> // for std::size() but not working yet
void splitInteger(int integer, int components[])
{
int count{0};
do
{
int element{ integer % 10 };
components[count] = element;
integer = integer / 10;
++count;
}
while(integer != 0);
}
int main()
{
int num{};
std::cin >> num;
int components[]{};
splitInteger(num, components);
std::cout << std::size(components) << '\n';
return 0;
}
它给出如下编译器错误:
tempCodeRunnerFile.cpp: In function ‘int main()’:
tempCodeRunnerFile.cpp:38:38: error: no matching function for call to ‘size(int [0])’
38 | std::cout << std::size(components) << '\n';
| ^
In file included from /usr/include/c++/9/string:54,
from /usr/include/c++/9/bits/locale_classes.h:40,
from /usr/include/c++/9/bits/ios_base.h:41,
from /usr/include/c++/9/ios:42,
from /usr/include/c++/9/ostream:38,
from /usr/include/c++/9/iostream:39,
from tempCodeRunnerFile.cpp:1:
/usr/include/c++/9/bits/range_access.h:242:5: note: candidate: ‘template<class _Container> constexpr decltype (__cont.size()) std::size(const _Container&)’
242 | size(const _Container& __cont) noexcept(noexcept(__cont.size()))
| ^~~~
/usr/include/c++/9/bits/range_access.h:242:5: note: template argument deduction/substitution failed:
/usr/include/c++/9/bits/range_access.h: In substitution of ‘template<class _Container> constexpr decltype (__cont.size()) std::size(const _Container&) [with _Container = int [0]]’:
tempCodeRunnerFile.cpp:38:38: required from here
/usr/include/c++/9/bits/range_access.h:243:24: error: request for member ‘size’ in ‘__cont’, which is of non-class type ‘const int [0]’
243 | -> decltype(__cont.size())
| ~~~~~~~^~~~
/usr/include/c++/9/bits/range_access.h:252:5: note: candidate: ‘template<class _Tp, long unsigned int _Nm> constexpr std::size_t std::size(const _Tp (&)[_Nm])’
252 | size(const _Tp (&/*__array*/)[_Nm]) noexcept
| ^~~~
/usr/include/c++/9/bits/range_access.h:252:5: note: template argument deduction/substitution failed:
我不知道为什么会这样。任何帮助,将不胜感激。
另外,我正在使用带有这些标志的 g++:
g++ -Wall -Weffc++ -Wextra -Wsign-conversion -Werror -std=c++17
解决方案
首先,这个定义:
int components[]{};
是完全错误的。如果您真的需要旧的 c 样式数组,则需要使用 new 定义它们的大小:
int *components = new int[size];
C 风格的数组在编译期间必须知道它们的大小,除非你使用关键字 new。如果您想使用未定义大小的集合(可以修改),请阅读std::vector
. 当你想找到它的大小时,使用这个调用:
int size_of_v = std::size(v);
第一个代码之所以起作用,只是因为一个事实——编译器可以判断数组有多大。
推荐阅读
- bash - 匹配负整数或负浮点数
- ios - SwiftUI 搜索栏
- css - 梯形作为css3中的页面背景?
- json - 使用 azure logic app 编辑 json 内容
- javascript - 如果 Postman 中的测试失败(CollectionVariable?),则触发新请求
- vue.js - v-for 中的 V-model 正在填充所有输入
- javascript - 如何通过JS调用在Django模板标签中使用js变量来更新html内容?
- python-3.x - 多类分类机器学习
- macos - 无法在 Mac 上执行 FastX Toolkit
- request - 测试已完成的链链接 oracle 请求以太/安全帽的最佳实践是什么?