c++如何解决: Initial value of reference to non-const must be an lvalue

标签 c++ visual-studio-2017

我正在编写一个程序来确定一系列数字的质因数。在程序中,范围的startingNumberendingNumber 表示为std::pair

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const long long MAX = 100000000; // One hundred million
long long factor[MAX];


pair<const long long, const long long> get_pair() // Gets user start and end number to establish range in vector.
{
    long long largestNumber = 100000000;
    long long smallestNumber = 2;
    std::pair<long long, long long> p;
    cout << "Enter a start number: ";
    cin >> p.first;
    while (p.first < smallestNumber || p.first > largestNumber || cin.fail()) {
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "That's not a valid choice. Please try again (" << smallestNumber << " - " << largestNumber << "): ";
        cin >> p.first;
    }
    cout << "Enter a end number: ";
    cin >> p.second;
    while (p.second < p.first || p.second > largestNumber || cin.fail()) {
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "That's not a valid choice. Please try again (" << p.first << " - " << largestNumber << "): ";
        cin >> p.second;
    }
    cout << endl;

    return make_pair(p.first, p.second);
}

vector<long long> rangeToVector(const long long &startingNumber, const long long &endingNumber) // creates vector of numbers from std::pair.
{
    vector<long long> iterator;

    for (long long i = 1; i <= ((10 - 1) + 1); i += 1) iterator.push_back((1-1)+i);

    return iterator;
}
void precalculate() // Calculates all of the prime numbers between 1 and MAX. Stores prime numbers from smallest to largest.
{
    for (long long i = 1; i < MAX; i++) { // stores 1 through Max in factor.
        factor[i] = i;
    }

    for (long long i = 2; i * i < MAX; i++) if (factor[i] == i) { // If factor[i] is even.
        for (long long j = i + i; j < MAX; j += i) {
            factor[j] = i;
        }
    }
}

以上代码按预期工作。然后将代码输入到 follow 函数中,我不确定是否正确运行(因为我在 main 中的函数将无法编译)。

vector<long long> get_factors(vector<long long> &vect) // performs calculation on rangeToVector[i] (determined by precalculate) until it is not divisible, then it returns those that were divided into the number as prime factors of the rangeToVector[i].
{
    vector<long long> factors;
    for (auto i : vect)
    {
        while (vect[i] > 1)
        {
            long long f = factor[vect[i]];
            factors.push_back(f);
            vect[i] /=f;
        }
    }

    sort(factors.begin(), factors.end()); // sorts the vector.
    factors.erase(unique(factors.begin(), factors.end()), factors.end()); // erases duplicates (requires sorted vector).

    return factors;
}

在 main(第 3 行)中,我收到错误下划线 rangeToVectorinitial value of reference to non-const must be an lvalue

int main()
{
    for (auto i : get_factors(rangeToVector(pairs.first, pairs.second))) // get_factors returns factors of numbers in vector rangeToVector
    {
        cout << i << " ";
    }
    system("pause");
    return 0;
}

我试图使 rangeToVector 中的值成为常量,但这并没有解决问题。我的问题是,我的引用不正确吗?我应该以不同的方式传递函数吗?或者我可以对代码做什么以允许 get_factors 在第 3 行的 main 中获取 rangeToVector[i] 的因素。我是 c++ 的新手,所以任何帮助都会不胜感激。

最佳答案

你的问题出在这里:

std::vector<long long> get_factors(std::vector<long long> &vect) { ... }

变量 vect 是一个左值引用,这意味着它是一个不能绑定(bind)到临时变量的引用。

然而,你是这样使用它的:

get_factors(rangeToVector(...))

其中 rangeToVector 返回一个临时值。

解决方法就是让 vect 成为常量左值引用,它可以绑定(bind)到一个临时值:

//                                     const here  -------v
std::vector<long long> get_factors(std::vector<long long> const& vect) { ... }

您的代码中还有许多其他问题,我建议您阅读一本优秀的 C++ 并且尽量不要假设它的语法。例如,您没有正确使用 range for 循环:

for (auto i : vect) {
    while (vect[i] > 1) {
        long long f = factor[vect[i]];
        factors.push_back(f);
        vect[i] /=f;
    }
}

正确的用法是:

 for (auto& i : vect) {
    while (i > 1) {
        long long f = factor[i];
        factors.push_back(f);
        i /= f;
    }
}

关于c++如何解决: Initial value of reference to non-const must be an lvalue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49138623/

相关文章:

c# - "object is null"表达式出错

asp.net-mvc - 将 Visual Studio 2017 MVC View 脚手架更新到 Bootstrap 4

visual-studio-2017 - 使用 TypeScript 时无法在 Visual Studio 上格式化代码

gulp - VS2017 Task Runner Explorer 未找到任务

c++ - 从 C++ 中的文件输入

c++ - 将文件移动到另一个目录而不在目标目录中指定文件名的方法?

c++ - ReactiveCocoa 可以与纯 c++ ViewModel 一起使用吗?

c++ - 为什么斐波那契数列的这些动态编程实现中的一个比另一个更快?

c# - 将 C++ Hwnd 传递给 C# dll

visual-studio - Visual Studio调试设置保存在哪里?