广场未在此范围内宣布

时间:2016-04-07 16:18:12

标签: c++

在尝试使用“square()”函数编译简单程序时,“'square'未在此范围内声明”错误。

我正在使用Stroustrup的编程:使用C ++的原理和实践进行“尝试此”练习(“功能”部分),代码将无法编译。

以下是代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    for(int i=0; i<100; i++){
        cout<<i<<'\t'<<square(i)<<'\n';
    }
}

这就是我的编译返回的内容:

function.cpp: In function ‘int main()’:
function.cpp:10:26: error: ‘square’ was not declared in this scope
   cout<<i<<'\t'<<square(i)<<'\n';

我做了另一次尝试并在for循环中放置了一个函数声明:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    for(int i=0; i<100; i++){
        int square(i);
        cout<<i<<'\t'<<square(i)<<'\n';
     }
 }

回复是:

function.cpp: In function ‘int main()’:
function.cpp:11:26: error: ‘square’ cannot be used as a function
   cout<<i<<'\t'<<square(i)<<'\n';

此外,我将“square()”函数声明放在“main”主体内部以及“main”主体之前:回复与我对#2的响应相同。

编译器和操作系统是:

gcc version 5.2.1 20151028 (Ubuntu 5.2.1-23ubuntu1~15.10) 

我是一个新手,很可能错误在于一些非常简单的事情 - 但我认为我已经尝试过所有可能的选择。至于“std_lib_facilities.h”文件,它不起作用并给出“不赞成的标题”回复。

我会非常感谢任何帮助和建议。

3 个答案:

答案 0 :(得分:3)

编译器是对的:C和C ++都没有在标准库中提供名为TessBaseAPI.PageIteratorLevel.RIL_TEXTLINE的函数。此外,square不是函数声明。它会创建一个名为int square(i);的{​​{1}}变量,其初始值为int

应该做什么代码?

答案 1 :(得分:3)

您必须声明并使用以下函数:

#include <iostream>

int square(int x) {  // function declared and implemented
    return x*x;
}

int main(void) {

    for(int i=0; i<100; ++i) {
        std::cout<<i<<'\t'<<square(i)<<'\n';
    }

    return 0;
}

或者:

#include <iostream>

int square(int x);  // function prototype

int main(void) {

    for(int i=0; i<100; ++i) {
        std::cout<<i<<'\t'<<square(i)<<'\n';
    }

    return 0;
}

int square(int x) {   // function definition/implementation
    return x*x;
}

但对于像这样的简单代码,它不值得创建函数 - 相反,您只需在for循环内执行i*i即可实现相同的结果而无需调用函数。或者,您可以使用pow(x,n)中的<cmath>,但此处并不一定非必要。

另请注意我的示例中的++i循环中的for,但这里并不重要,但从开始学习i++是件好事。创建变量i的副本然后递增它 - 而执行++i不会复制。当i只是一个整数(例如)时,这是无关紧要的,但是当它可能是一个不同的实体(例如复制可能更昂贵的对象)时,它变得更加重要。

此外,最好不要放置using namespace std;,因为这会造成名称空间污染 - 有关详细信息,请参阅此处:

Why is "using namespace std" considered bad practice?

答案 2 :(得分:1)

在cmath中没有square()这样的函数。你需要pow(base,exp)。以下代码应该编译。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    for(int i=0; i<100; i++){
        cout<<i<<'\t'<<pow(i, 2)<<'\n';
     }
 }