繁体   English   中英

错误:function 未在此 scope 中声明

[英]error: function was not declared in this scope

我必须执行这个简单的练习:我有一个缓冲区,我必须将从 input_file.txt 文件中获取的数据插入到该缓冲区中,例如:

1
2
3
4

然后将这些数据读取并插入到read_position function 的缓冲区中,然后将它们读取并写入到write_position function 的终端。另外,我必须管理对缓冲区的访问。 这是 buffer.h:

// Buffer.h

#ifndef Buffer_h
#define Buffer_h

#include <queue>
using std::queue;
#include <mutex>
using std::mutex;
#include <condition_variable>
using std::condition_variable;

class Buffer
{
    public:
        void append(double v);
        double take();

    private:
        queue<double> buffer_;
        mutex mutex_;
        condition_variable not_empty_;       
};

#endif

这是 buffer.cpp:

//Buffer.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <fstream>
using std::ifstream;
#include <string>
using std::string;
#include <mutex>
using std::mutex;
using std::unique_lock;
#include <condition_variable>
using std::condition_variable;

#include "Buffer.h"

void Buffer::append(double shift)
{
    unique_lock<mutex> mlock(mutex_);
    buffer_.push(shift);
    not_empty_.notify_one(); //signalC
}

double Buffer::take()
{
    unique_lock<mutex> mlock(mutex_);
    while(buffer_.empty())
        not_empty_.wait(mlock); //waitC
    double posit =buffer_.front();
    buffer_.pop();
    return posit;
}

void read_position(Buffer buf)
{
    ifstream input("input_file.txt");
        if(!input.is_open())
    {
        cout << "Unable to open the input file." << endl;
        exit(EXIT_FAILURE);
    }
   string line;
   while (getline (input, line)){
        size_t pos = line.find_first_of(" ",0);
        double position = stod(line.substr(pos+1,line.size()));
        buf.append(position);
    }
}

void write_position(Buffer buf)
{
    for(int i=0; i<4; i++){
            double pos= buf.take();
            cout<<pos<<endl;
    }
}

这是主要的:

#include <iostream>
using std::cout;
using std::endl;
#include <thread>
using std::thread;


#include "Buffer.h"

Buffer b1;

int main(int argc, char* argv[])
{
    thread read{read_position, b1};
    thread write{write_position, b1};

    read.join();
    write.join();
   
    cout << "End of main thread." << endl;

    return 0;
}

编译时出现此错误:

main.cpp: In function ‘int main(int, char**)’:
main.cpp:35:17: error: ‘read_position’ was not declared in this scope
   35 |     thread read{read_position, b1};
      |                 ^~~~~~~~~~~~~
main.cpp:35:34: error: no matching function for call to ‘std::thread::thread(<brace-enclosed initializer list>)’
   35 |     thread read{read_position, b1};
      |                                  ^
In file included from main.cpp:4:
/usr/include/c++/9/thread:144:5: note: candidate: ‘std::thread::thread(std::thread&&)’
  144 |     thread(thread&& __t) noexcept
      |     ^~~~~~
/usr/include/c++/9/thread:144:5: note:   candidate expects 1 argument, 2 provided
/usr/include/c++/9/thread:117:7: note: candidate: ‘template<class _Callable, class ... _Args, class> std::thread::thread(_Callable&&, _Args&& ...)’
  117 |       thread(_Callable&& __f, _Args&&... __args)
      |       ^~~~~~
/usr/include/c++/9/thread:117:7: note:   template argument deduction/substitution failed:
/usr/include/c++/9/thread:112:5: note: candidate: ‘std::thread::thread()’
  112 |     thread() noexcept = default;
      |     ^~~~~~

函数read_positionwrite_position未声明为对main.cpp可见。

您应该在Buffer.h中声明它们,例如:

class Buffer
{
    // omit: same as original       
};

void read_position(Buffer buf);
void write_position(Buffer buf);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM