首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有处理“错误:使用未声明的标识符‘”的方法?

有没有处理“错误:使用未声明的标识符‘”的方法?
EN

Stack Overflow用户
提问于 2022-04-11 21:53:35
回答 2查看 1.4K关注 0票数 -4

我有以下几段代码,并且得到了一堆相同的未声明标识符错误。根据我编写的其他代码,主文件上的#include "rec_fun.h“应该允许在该文件中使用函数。因为我同时编译了rec_fun.cpp和main.cpp,这应该会生成一个可执行名称FINAL。

错误:

代码语言:javascript
运行
复制
MaryMcBeth@unknown88665a207c1a Recursion_Program % g++ -std=c++14 rec_fun.cpp main.cpp -o FINAL

main.cpp:17:12: error: use of undeclared identifier 'fib_recursion'
           fib_recursion(i);// Replace with call to your function.
           ^
main.cpp:18:12: error: use of undeclared identifier 'fib_iterative'
           fib_iterative(i);
           ^
main.cpp:28:6: error: use of undeclared identifier 'triangle'
     triangle(cout, 3, 5);
     ^
main.cpp:31:6: error: use of undeclared identifier 'numbers'
     numbers(cout, "THERBLIG", 2);
     ^
4 errors generated.
MaryMcBeth@unknown88665a207c1a Recursion_Program % 

main.cpp:

代码语言:javascript
运行
复制
#include <iostream>
#include <chrono>
#include "rec_fun.h"


using namespace std;
using namespace std::chrono;

int main() 
{
     high_resolution_clock::time_point startTime = high_resolution_clock::now();
     int i;
     for (i = 0; i < 1000000; i++)
     {
           fib_recursion(i);// Replace with call to your function.
           fib_iterative(i);
                        
     }
     high_resolution_clock::time_point endTime = high_resolution_clock::now();
     duration<float> time_span = endTime - startTime;

     std::cout << fixed;
     std::cout << "It took " << time_span.count() << " seconds.";
     std::cout << std::endl;
     cout<<"---------------"<<endl;
     triangle(cout, 3, 5);
     return 0;
     cout<<"------------------"<<endl;
     numbers(cout, "THERBLIG", 2);
     cout<<"-------------------------"<<endl;

}

rec_fun.cpp:

代码语言:javascript
运行
复制
#include<iostream>
#include <chrono>
#include "rec_fun.h"
#include <string>

using namespace savitch2;
using namespace std;
using namespace std::chrono;



void recursion::numbers(ostream &outs, const string& prefix, unsigned int levels)

{


    if(levels == 0)

        outs << prefix << endl;

    else

    {

        for(char c = '1'; c <= '9'; c++)

        {

            s = prefix + c + '.';

            numbers(outs, s, levels-1);

        }

    }

}



bool recursion::bears(int n)
{
    

    if (n < 42) return false;
    if (n == 42) return true;
    if ((n%2) == 0)
        if (bears(n/2)) return true;
    if (((n%3)==0) || ((n%4)==0))
    {
        ones = n % 10;
        tens = (n % 100)/10;
        if ((ones != 0) && (tens != 0) && (bears(n-ones*tens)))
            return true;
    }
    if ((n%5) == 0)
        if (bears(n-42)) return true;
    return false;
}

//recursive helper method to return a string containing count number of '*'
string recursion::asterisks(int count)
{
        //if count is above 0, returning one '*' followed by the value returned
        //from recursive call to asterisks passing count-1 as argument
        if(count>0){
                return "*"+asterisks(count-1);
        }
        //else, if count is 0 or negative, returning empty string
        else{
                return "";
        }
}

//required method
void recursion::triangle(ostream &outs, unsigned int m, unsigned int n)
{
        //proceeding only if m<=n.
        //if m>n, recursion stops (base case)
        if(m<=n){
                //making a string containing m number of asterisks
                string ast=asterisks(m);
                //printing it to outs
                outs<<ast<<endl;
                //making a recursive call passing m+1 as new m
                triangle(outs,m+1,n);
                //printing ast to outs once again
                outs<<ast<<endl;
        }
}


int recursion::fib_iterative(int n) {
    if(n == 1 || n == 2)
        return 1;
    int A[2][2] = { { 1, 1 },{ 1, 0 } };
    int B[2][2] = { { 1, 1 },{ 1, 0 } };
    int temp[2][2];
    while (n >= 2) {
         for (int i = 0; i < 2; i++)
             for (int k = 0; k < 2; k++) {
                 temp[i][k] = 0;
                 for (int j = 0; j < 2; j++)
                     temp[i][k] += A[i][j] * B[j][k];
              }
         for (int i = 0; i < 2; i++)
             for (int j = 0; j < 2; j++)
                 B[i][j] = temp[i][j];
         n--;
    }
    return B[0][1];
}

int recursion::fib_recursion(int n)
{
    if (n == 0)
        return 0;
    else if (n == 1)
        return 1;
    else
        return fib_recursion(n-1) + fib_recursion(n-2);
}

rec_fun.h:

代码语言:javascript
运行
复制
#include<iostream>
#include <string>

using namespace std;

namespace savitch2
{
    class recursion
    {
        public:
            bool bears(int n);
            void triangle(ostream &outs, unsigned int m, unsigned int n);
            string asterisks(int count);
            void numbers(ostream &outs, const string& prefix, unsigned int levels);
            int fib_iterative(int n);
            int fib_recursion(int n);
        private:
            int ones;
            int tens;
            string s;

    };




}

预期产出:

代码语言:javascript
运行
复制
It took 8 seconds
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-11 22:45:24

你需要做的

代码语言:javascript
运行
复制
 int i;
 recursion rec;
 for (i = 0; i < 1000000; i++)
 {
       rec.fib_recursion(i);// Replace with call to your function.
       rec.fib_iterative(i);

因为您的函数是类方法,所以必须创建类的实例才能使用它们。

票数 1
EN

Stack Overflow用户

发布于 2022-04-11 22:18:49

您需要创建一个类实例。本质上,程序中的函数不是独立的函数,它们是类的方法(在您的例子中是class=recursion),因此获得错误:‘使用未声明的标识符’是有意义的。

文件中创建类递归的实例,通过中的该实例调用这些函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71834694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档