首页 > 解决方案 > 无法在一个程序中使用 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

标签: c++c++17

解决方案


首先,这个定义:

int components[]{};

是完全错误的。如果您真的需要旧的 c 样式数组,则需要使用 new 定义它们的大小:

int *components = new int[size]; 

C 风格的数组在编译期间必须知道它们的大小,除非你使用关键字 new。如果您想使用未定义大小的集合(可以修改),请阅读std::vector. 当你想找到它的大小时,使用这个调用:

int size_of_v = std::size(v);

第一个代码之所以起作用,只是因为一个事实——编译器可以判断数组有多大。


推荐阅读