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

Posted

技术标签:

【中文标题】C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 \'&\' 需要左值)【英文标题】:C++ (E0158 expression must be an lvalue or a function designator) and (Error C2102 '&' requires l-value)C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要左值) 【发布时间】:2019-07-05 16:02:15 【问题描述】:

在我的作业中,我的任务是为 prefix_vector 创建一个类,因此主要工作无需任何修改。

我总是遇到错误:

E0158 表达式必须是左值或函数指示符

错误 C2102 '&' 需要左值

我怎样才能在没有任何编译错误的情况下做到这一点?

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 表达式必须是左值或函数指示符

错误 C2102 '&' 需要左值

输出应该是:

you did great

【问题讨论】:

T at(const T &amp; x) -> T&amp; at(std::size_t x)?另外,如果T 可以是std::string,为什么还要在那里使用const T &amp; std::vector &lt;T&gt; &amp; vsuf 未初始化。 【参考方案1】:

这个错误:

E0158 expression must be an lvalue or a function designator

Error   C2102   '&' requires l-value

表示您正在尝试获取非法的临时地址(在本例中为 r 值)。在某个对象上使用&amp; 意味着获取它的地址——所以它必须存在于内存中的某个地方。 l 值是可能存储在 CPU 寄存器中的对象,因此获取它的地址是没有意义的。

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

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

你应该:

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

修复后,你可能会发现很多其他的错误,但我想你可以自己处理。

【讨论】:

【参考方案2】:

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

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

或者更改at 以返回一个引用,然后您可以获得一个指向的指针。

【讨论】:

以上是关于C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要左值)的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2106:'=':左操作数必须是左值 c++

C++ 错误“左操作数必须是左值”

C++:神一样的左值

c++:函数左值或右值

C++右值引用万能引用完美转发和引用折叠

C++右值引用万能引用完美转发和引用折叠