C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要 l 值)
C++ (E0158 expression must be an lvalue or a function designator) and (Error C2102 '&' requires l-value)
在我的作业中,我得到了为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
以返回一个参考
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要 l 值)
- C++错误 C2102:"&"需要 l 值