C++ co znamená chyba "Počáteční hodnota odkaz na non-const, musí být lvalue" znamená v tomto případě?

0

Otázka

Jsem úplný začátečník v C++ a byl přidělen napsat funkci, která vrátí faktory čísla. Níže jsem zařadil funkci jsem také vytvořil tzv. print_vector které se budou tisknout všechny prvky vektoru do Konzole.

V můj úkol, aby zkontrolovat, zda factorize funkce pracuje, budeme muset použít test_factorize podle funkce, které mám také v ceně. Nicméně, problém jsem běžet do je, že vzhledem k test_factorize nefunguje z důvodu chyby "Počáteční hodnota odkaz na non-const, musí být lvalue." Já jsem si nejste jisti, co to znamená a proč test_factorize narazí na problém, protože výstup z factorize je vektor a vstup print_vector je také vektor, takže nevidím důvod, proč obsah test_factorize následek chybu, i když jsem podezření, že by mohlo být něco v `faktorizovat funkce jsem definovala, který způsobuje tuto chybu.

#include <iostream>
#include <vector>

using namespace std;

void print_vector(std::vector<int>& v) {
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

std::vector<int> factorize(int n) {
    std::vector<int> answer;
    for (int i = 1;i < n + 1; ++i) {
        if (n % i == 0) {
            answer.push_back(i);
        }
    }
    return answer;
}

void test_factorize() {
print_vector(factorize(2));
print_vector(factorize(72));
print_vector(factorize(196));
}
c++ function stdvector
2021-11-23 23:13:16
1

Nejlepší odpověď

2

Chyba je z tohoto řádku:

void print_vector(std::vector<int>& v) {

Od té doby jste neměl obsahovat const klíčové slovo v argumentu typ, ty jsou (implicitně), což naznačuje, že print_vector má právo upravovat obsah v.

Nicméně, říkáte print_vector() s dočasný objekt (vektor vrátil factorize()) jako argument, a C++ neumožňuje projít dočasný objekt non-const reference, pravděpodobně na teorii, že provedením změn na dočasný objekt je zbytečné (protože dočasná bude zničen, jakmile volání funkce vrátí, takže všechny změny provedené na to nebude mít žádný efekt), a proto musí programátor chybu.

V každém případě, opravit je snadné, stačí změnit nastavení funkce prohlášení:

void print_vector(const std::vector<int>& v) {

... a to vám umožní předat odkaz---dočasné-vektor.

2021-11-23 23:17:43

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................