预期的标识符

美食饼干

我试图找到一个数组的绝对和。

#include <iostream>
#include <vector>
using namespace std;

int getAbsSum(vector<int> arr) {
    int result = 0;
    for (int i = 0; i < arr.size(); i++)
    {
        result += abs(arr[i]);
    }

    return result;
}

int main() {
    cout << getAbsSum([3, 2, -3, -4]);
    return 0;
}

但我在主函数中遇到了这样的错误消息:“ Expected an identifier”。我试图在数组之前添加一个类型名,像这样

 cout << getAbsSum(int [3, 2, -3, -4]);

但它没有用。

Arjonais

的含义[ ]不是您在示例中传达的含义[]用于指示数组索引,并且仅支持一个参数。因此,3, 2, -3, -4在此上下文中的表达式意味着求值3,然后求值2,然后是-3,然后是-4,然后返回求值-4的结果。看到

https://zh.cppreference.com/w/cpp/language/operator_other

因为表情32-3没有任何副作用,这里的结果是一样的,如果你只是写-4对于预期的标识符错误,operator [ ]要求在其前面有一个变量,因此arr[1]意味着返回数组(或容器)arr中的第二个对象。解决方案是对列表初始化使用正确的语法,这是统一初始化的一种形式(不要与用于聚合的聚合初始化混淆。向量不是聚合):

cout << getAbsSum({3, 2, -3, -4});

另外,我建议不要using namespace std;在全局工作空间中使用,而只能在作用域受限的作用域内(即在函数内)使用。此功能的现代版本可以重写如下:

#include <iostream>
#include <vector>
#include <chrono>

template <typename E = int,
    template <typename> typename T = std::vector>
E getAbsSum(T<E> const& arr){ 
    E result {};
    for (E element : arr)
    {
        result += abs(element);
    }
    return result;
}

int main() {
    using namespace std;
    using namespace std::literals;
    cout << getAbsSum({3, 2, -3, -4}) << '\n';
    cout << getAbsSum(vector<double>{2.3, 4.5, 6}) << '\n';
    cout << getAbsSum(vector<chrono::seconds>{10s, 1min}).count() << '\n';
    return 0;
}

此版本支持任何算术类型和任何容器。

回应@foodiecookies:

(1)在这里,该行E result {};表示调用了E的默认构造函数。如果使用,E result = 0则初始化会出错chrono::seconds,但是如果使用E result,则不会初始化算术类型,这是未定义的行为。E result {}调用复杂类型的默认构造函数,基本类型的值设置为0或等效值(0.f,0.,false,...)。

(2)for (auto var : container)是基于范围的循环。请参阅https://en.cppreference.com/w/cpp/language/range-for,它被认为更安全,更易于阅读。for(;;)当您不遍历容器中的所有元素时,请使用旧的。

(奖金)由于参数依赖查找https://en.cppreference.com/w/cpp/language/adlabs(element)找到了abs函数的正确版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章