标题:我这段代码为什么报了十个错误呢
只看楼主
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
结帖率:82.28%
已结贴  问题点数:1 回复次数:10 
我这段代码为什么报了十个错误呢
程序代码:
#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    非法的间接寻址   
搜索更多相关主题的帖子: int begin 错误 模板 std 
2023-04-05 19:23
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:185
帖 子:1404
专家分:8479
注 册:2010-3-16
得分:1 
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;
}
2023-04-06 01:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
函数参数类型改为 std::span<int>
2023-04-06 07:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
上策:
程序代码:
#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编辑过]

2023-04-06 08:41
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
得分:0 
回复 4楼 rjsp
好的,明白了,非常感谢
2023-04-06 13:22
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
得分:0 
回复 2楼 apull
你好,add(int a[3])为什么实际上时add(int *)呢
为什么不是int,按照我的理解,a[3]表示一个整型的元素
2023-04-06 13:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
你好,add(int a[3])为什么实际上时add(int *)呢
为什么不是int,按照我的理解,a[3]表示一个整型的元素

我插个嘴,int a[3] 是断句成 int[3] 和 a,即 类型名 和 变量名。不是断句成 int 和 a[3]
2023-04-06 13:41
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
得分:0 
回复 7楼 rjsp
哦哦明白了明白了
2023-04-06 13:44
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
得分:0 
回复 2楼 apull
请问需要知道a的范围,a的范围不就是a[3]里面的3么
2023-04-06 13:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
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")
2023-04-06 14:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511804-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017590 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved