C++ 中 readfile 函数的编译错误

Compilation error with readfile function in C++

我正在尝试制作一个 C++ 程序,它使用 ifstream 从文件中读取数据。这是我的程序代码:

#include<iostream>
#include<fstream>
#include<string>
#include "sort.h"

std::vector<int> readfile(std::string &filename)
{
    // Open the file 
    std::ifstream file(filename, std::ios::binary);
    // Get the size of the file - seek to end 
    file.seekg(0, file.end);
    std::streampos size = file.tellg();
    // Seek back to start
    file.seekg(0,file.beg);
    // Number of elements is size / sizeof(int)
    int elements = size / sizeof(int);
    // Create an array of data to raead into
    int *temp = new int[elements];
    // Read in data
    file.read((char*)temp, size);
    // Close the file 
    file.close();
    //Copy data into the vector 
    std::vector<int> data(temp, temp + elements);
    // Delete the data
    delete[] temp;
    // Return the vector
    return data;
}

int main(int argc, char **argv)
{
    // Read in a vector
    std::vector<int> data = readfile(std::string("numbers.dat"));
    // Print the vector size 
    std::cout<<"Numbers read = "<<data.size() <<std::endl;
    // Sort the vector 
    sort(data);
    // Output first 100 numbers
    for(int i = 0; i < 100; i++)
    {
        std::cout<<data[i]<<std::endl;
    }
    return 0;
}

头文件 sort.cpp 是:

#include "sort.h"
#include<iostream>

void sort(std::vector<int> &data)
{
    // Iterate through each value
    for( int i = 0; i< data.size(); ++i)
    {
        // Loop through values above index i 
        for(int j = 0; j < data.size() - (i + 1);  ++j)
        {
           if(data[j] > data[j+1])
            {
                // Swap values 
                int temp = data[j+1];
                data[j+1] = data[j];
                data[j] = temp;
            }
        }
     if(i % 1000 == 0)
     {
     std::cout<<((float)i / (float)data.size()) * 100.0f << "% sorted" << std::endl;
     }      

  }
}

我得到的错误是:

ifstream.cpp: In function ‘int main(int, char**)’:
ifstream.cpp:34:40: error: cannot bind non-const lvalue reference of type ‘std::__cxx11::string& {aka std::__cxx11::basic_string<char>&}’ to an rvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’
  std::vector<int> data = readfile(std::string("numbers.dat"));
                                        ^~~~~~~~~~~~~~~~~~~~~
ifstream.cpp:6:18: note:   initializing argument 1 of ‘std::vector<int> readfile(std::__cxx11::string&)’
 std::vector<int> readfile(std::string &filename)

我想知道为什么这不起作用。是 GCC 不喜欢任何东西,还是我这个没有经验的人坚持 C++。提前致谢!

函数参数中缺少关键字 const。这个错误的原因是,C++ 不希望用户更改临时变量的值,因为它们可以随时从内存中删除。这样做是为了避免临时变量被传递然后导致问题的问题。 函数定义可以改成:

std::vector<int> readfile(const std::string &filename)

我认为是 readfile 函数定义中的引用导致了问题。如果您从函数声明和定义的参数中删除引用,则代码编译得很好。

std::vector<int> readfile(std::string filename)