C ++ (выражение E0158 должно быть lvalue или обозначением функции) и (Ошибка C2102 '&' требует l-значение) - PullRequest
1 голос
/ 05 июля 2019

В своей домашней работе я получил задание создать класс для prefix_vector, поэтому основная работа без каких-либо изменений.

Я всегда сталкиваюсь с ошибками:

E0158 выражение должно бытьlvalue или обозначение функции

и

Ошибка C2102 '&' требует l-значение

Как я могу сделать это без компиляцииошибка?

template <class T>
class prefix_vector
{
public:
    prefix_vector(std::vector <T>& x) :vpre{ x }
    {
    }
    void push_back(const T & t)
    {
        for (unsigned int i = 0; i < vpre.size(); i++)
        {
            if (t == vpre[i])
            {
                vpre.erase(vpre.begin() + i);
            }
        }
        vsuf.push_back(t);
        for (int i = 1; i < vsuf.size(); ++i)
        {
            for (int j = 0; j < vsuf.size() - 1; ++j)
            {
                if (vsuf[j] > vsuf[i]) std::swap(vsuf[j], vsuf[i]);
            }
        }
    }
    T  at(const T &  x)
    {
        std::vector <T> vpresu = vpre;

        for (int i = 0; i < vsuf.size(); i++)
        {
            vpresu.push_back(vsuf[i]);
        }
        return vpresu[x + vsuf.size()];
    }

    int size() const
    {
        return vsuf.size();
    }

private:
    std::vector <T> & vpre;
    std::vector <T> & vsuf;
};


const int max = 1000;

int main()
{
    std::vector<int> v;
    for (int i = 0; i < max; ++i)
    {
        v.push_back(i);
    }

    prefix_vector<int> p(v);
    prefix_vector<int> a(p);
    prefix_vector<int> b(p);
    prefix_vector<int> c(p);

    a.push_back(2);
    b.push_back(4);
    c.push_back(8);
    c.push_back(1);

    std::vector<std::string> s;
    s.push_back("Hello");
    prefix_vector<std::string> sh(s);
    prefix_vector<std::string> sa(sh);
    sa.push_back("World");
    prefix_vector<std::string> sb(sh);


    if (8 == c.at(max) && &(a.at(max / 2)) == &(b.at(max / 2)) &&
        a.size() == b.size() && 1 == p.at(1) && 4 == b.at(max) &&
        &(b.at(max - 1)) == &(c.at(max - 1)) &&
        &(b.at(max)) != &(c.at(max)) && 1 == sb.size() &&
        1 == sh.size() && "Hello" == sa.at(0))
    {
        std::cout << "you did great" << std::endl;
    }
}

Я получаю

E0158 выражение должно быть lvalue или обозначением функции

Ошибка C2102 '&' требует l-значение

Вывод должен быть:

you did great

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Эта ошибка:

E0158 expression must be an lvalue or a function designator

Error   C2102   '&' requires l-value

означает, что вы пытаетесь получить временный адрес (в данном случае значение r), который является недопустимым.Использование & для какого-либо объекта означает получение его адреса - поэтому он должен где-то существовать в памяти.l-значения - это объекты, которые могут храниться в регистре процессора, поэтому нет смысла брать его адрес.

В вашем случае вы пытаетесь сравнивать адреса вместо значений, поэтому вместо:

&(a.at(max / 2)) == &(b.at(max / 2))
^                   ^

вам следует:

(a.at(max / 2)) == (b.at(max / 2))

После исправления вы, вероятно, найдете множество других ошибок, но я полагаю, что вы сами справитесь с ними.

0 голосов
/ 05 июля 2019

at возвращает временную копию объекта в вашем векторе. Вы не можете получить указатель на временный объект (или «r-значение»), поэтому &(a.at(max / 2)) генерирует ошибку.

Я не уверен, что вы пытаетесь проверить, но я думаю, (a.at(max / 2)!= 0) - правильный синтаксис.

В качестве альтернативы измените at, чтобы вернуть ссылку, на которую вы затем можете получить указатель.

...