【问题标题】:"not in this scope" error in cpp function callingcpp函数调用中的“不在此范围内”错误
【发布时间】:2014-10-14 02:18:13
【问题描述】:

我试图在 cpp 中实现归并排序。但是,Dev-cpp 5.6.1 报告了一些“不在此范围内”的错误。它说,“lo”、“mid”和“hi”没有在这个范围内声明。你能告诉我为什么会这样吗?谢谢。

#include<iostream>
using namespace std;
void merge(int nums[], int lo, int mid, int hi) {
    int n1 = mid - lo + 1;
    int n2 = hi - mid + 1;
    /*Other implementation code omitted*/
}
int main() {
    /*code to Input numbers into nums[]*/
    merge(nums, 0, 4, 9);
    return 0;
}

【问题讨论】:

  • 当你将nums作为参数传递时,为什么它是一个全局变量? int[] &amp;nums 不是合法的语法,你的意思是 int nums[]
  • 我将 nums[] 设置为全局,因为会有另一个函数 merge_sort() 也适用于 nums[]。是的,我的意思是int nums[]。但是int nums[] 没有使用参考。 merge(int nums[], int lo, int mid, int hi)可以修改全局nums[]吗?
  • C++ 中的 C 样式数组很奇怪,并且不遵循正常语法。 int nums[] 不会复制数组,对它的更改会影响传递的数组。不要使用全局变量。如果你想让merge_sort 在一个不是 nums 的数组上工作怎么办?这就是它有参数的原因。
  • 哦,我知道。我将更改代码。谢谢。但另一个问题仍然存在。为什么说“lo”、“mid”和“hi”是“未在作用域内声明”?
  • 你提供了完整的代码吗? ideone.com/05Q2lH

标签: c++ function parameters scope


【解决方案1】:

在阅读涉及语法错误的错误消息时,最重要的是要特别注意第一个错误消息。这是因为 C++ 编译器没有义务在第一个错误处停止,第一个错误可能会产生更多错误。

在您的原始代码中,您在向 merge() 函数声明 nums 参数时出现语法错误:

#include<iostream>
using namespace std;
int nums[10];
void merge(int[] &nums, int lo, int mid, int hi) {
    int n1 = mid - lo + 1;
    int n2 = hi - mid + 1;
    /*Other implementation code omitted*/
}
int main() {
    /*code to Input numbers into nums[]*/
    merge(nums, 0, 4, 9);
}

您已经编辑了您的程序以删除该语法错误,但使用此原始代码,我看到以下错误消息:

x.cc:3: error: expected ',' or '...' before '&' token
x.cc: In function 'void merge(int*)':
x.cc:4: error: 'mid' was not declared in this scope
x.cc:4: error: 'lo' was not declared in this scope
x.cc:5: error: 'hi' was not declared in this scope
x.cc: In function 'int main()':
x.cc:3: error: too many arguments to function 'void merge(int*)'
x.cc:11: error: at this point in file

您报告了was not declared in this scope 错误,但没有提及第一个错误,即指出nums 的语法错误。由于此语法错误,编译器无法解析其余的函数参数,因此将这些标识符报告为没有可见声明。

修复此错误会删除其他错误。这是因为函数原型的解析器现在拾取了函数参数的其余部分,因此这些参数现在在函数的其余部分的范围内。

【讨论】:

  • 非常感谢您告诉我这件事!下次我会专注于第一个错误。
猜你喜欢
  • 1970-01-01
  • 2020-08-23
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多