注册 登录
编程论坛 C++教室

我这段代码为什么报了十个错误呢

后卿 发布于 2023-04-05 19:23, 234 次点击
程序代码:
#include<iostream>
int add(int a[3])
{
    int sum{};
    for (int x : a)
    {
        sum += x;
    }
    std::cout << sum;
    return 0;
}
int main()
{
    int a[3]{ 0,1,2 };
    add(a);
    system("pause");
}


错误    C3536    “<begin>$L0”: 初始化之前无法使用   
错误    C3536    “<end>$L0”: 初始化之前无法使用      
错误    C2672    “begin”: 未找到匹配的重载函数   
错误    C2784    “const _Elem *std::begin(std::initializer_list<_Elem>) noexcept”: 未能从“int []”为“std::initializer_list<_Elem>”推导 模板 参数   
错误    C2784    “const _Elem *std::end(std::initializer_list<_Elem>) noexcept”: 未能从“int []”为“std::initializer_list<_Elem>”推导 模板 参数   
错误    C2672    “end”: 未找到匹配的重载函数   
错误    C2893    未能使函数模板“unknown-type std::begin(_Container &)”专用化   
错误    C2893    未能使函数模板“unknown-type std::end(_Container &)”专用化   
错误(活动)    E2291    此基于范围的“for”语句需要适合的 "begin" 函数,但未找到   
错误    C2100    非法的间接寻址   
10 回复
#2
apull2023-04-06 01:46
int add(int a[3])对编译器来说实际上是int add(int *),他并不知道你的参数是指针还是数组。

for (int x : a) 基本等价于下面语句,需要知道a的范围。
for (int *beg = a.begin(), *end = a.end(); beg != end; ++beg)
{
    int x = *beg;
}
#3
rjsp2023-04-06 07:41
函数参数类型改为 std::span<int>
#4
rjsp2023-04-06 08:41
上策:
程序代码:
#include <iostream>
#include <numeric>
using namespace std;

int main( void )
{
    int a[3] = { 0, 1, 2 };
    cout << reduce(begin(a),end(a)) << endl;
}


中策:
程序代码:
#include <iostream>
#include <span>

int add( std::span<const int> a ) noexcept
{
    int sum{};
    for(int x : a)
        sum += x;
    return sum;
}

int main( void )
{
    int a[3] = { 0, 1, 2 };
    std::cout << add(a) << std::endl;
}


下策:
程序代码:
#include <iostream>

template<size_t N>
int add( const int (&a)[N] ) noexcept
{
    int sum{};
    for(int x : a)
        sum += x;
    return sum;
}
int main()
{
    int a[3] = { 0, 1, 2 };
    std::cout << add(a) << std::endl;
}



[此贴子已经被作者于2023-4-6 08:53编辑过]

#5
后卿2023-04-06 13:22
回复 4楼 rjsp
好的,明白了,非常感谢
#6
后卿2023-04-06 13:26
回复 2楼 apull
你好,add(int a[3])为什么实际上时add(int *)呢
为什么不是int,按照我的理解,a[3]表示一个整型的元素
#7
rjsp2023-04-06 13:41
你好,add(int a[3])为什么实际上时add(int *)呢
为什么不是int,按照我的理解,a[3]表示一个整型的元素

我插个嘴,int a[3] 是断句成 int[3] 和 a,即 类型名 和 变量名。不是断句成 int 和 a[3]
#8
后卿2023-04-06 13:44
回复 7楼 rjsp
哦哦明白了明白了
#9
后卿2023-04-06 13:47
回复 2楼 apull
请问需要知道a的范围,a的范围不就是a[3]里面的3么
#10
rjsp2023-04-06 14:25
void foo( int a[3] )
void foo( int a[4] )
void foo( int a[] )
void foo( int* a )
void foo( int* const a )
等等,在编译器眼中都是 void foo( int* )

如果 数组不退化为指针 的话,那么 因为不同长度的数组是不同的类型,所以 传入不同长度的数组就需要一个不同的函数。
以 strlen 举例,以后不可以写 strlen("a") 和 strlen("abc")
因为 "a" 和 "abc" 类型不一致,前者是 const char[2],后者是 const char[4],需要两个参数不一样的函数分别处理
即以后只能写 strlen2("a") 和 strlen4("abc")
#11
后卿2023-04-07 18:04
回复 10楼 rjsp
好的明白了非常感谢
1