C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要 l 值)

C++ (E0158 expression must be an lvalue or a function designator) and (Error C2102 '&' requires l-value)

本文关键字:错误 C2102 需要 函数 表达式 E0158 C++ 指示符      更新时间:2023-10-16

在我的作业中,我得到了为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'&amp;'需要L值

输出应为:

you did great

此错误:

E0158 expression must be an lvalue or a function designator
Error   C2102   '&' requires l-value

意味着您正在尝试获取非法的临时地址(在这种情况下为R-Value(。在某些对象上使用 &表示地址意味着它必须存在于某个地方的内存中。l值是可能存储在CPU寄存器中的对象,因此获取地址是没有意义的。

在您的情况下,您尝试比较地址而不是值,而不是:

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

您应该:

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

修复它后,您可能会发现许多其他错误,但我想您可以自己处理它们。

at它正在返回向量中对象的临时副本。您无法获得指向临时对象(或" R-Value"(的指针,因此&(a.at(max / 2))会产生错误。

我不确定您要测试什么,但我猜(a.at(max / 2)!= 0)是正确的语法。

另外,更改at以返回一个参考