gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:46:12 25 4
gpt4 key购买 nike

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

我总是遇到错误:

E0158 expression must be an lvalue or a function designator

Error C2102 '&' requires l-value

我怎样才能做到没有任何编译错误?

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 expression must be an lvalue or a function designator

Error C2102 '&' requires l-value

输出应该是:

you did great

最佳答案

这个错误:

E0158 expression must be an lvalue or a function designator

Error C2102 '&' requires l-value

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

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

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

你应该:

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

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

关于C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要左值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com