- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序是我在 2000 年为一个类(class)编写的,我想我会尝试运行它只是为了好玩。它曾经在 2000 年编译过,但我现在遇到了一堆错误。自那门课以来,我几乎没有看过 C++ 代码,所以我有点困惑。我解决了一堆关于 iostream.h 和 list.h 的投诉(把“std::”放在一堆像 std::cerr 等东西的前面)。我不知道这是否导致了当前错误,或者我的迭代器是否存在固有错误,但唯一需要解决的问题涉及一堆迭代器构造函数。首先,这是错误示例:
SolutionList.cpp:10:22: error: no matching constructor for initialization of 'PieceList::iterator'
PieceList::iterator i=rhs.first();
^ ~~~~~~~~~~~
./PieceList.h:27:5: note: candidate constructor not viable: expects an l-value for 1st argument
iterator(iterator& rhs){data = rhs.data;}
^
./PieceList.h:28:5: note: candidate constructor not viable: no known conversion from 'PieceList::iterator' to 'std::list<Piece>::iterator &'
(aka '__list_iterator<value_type, __void_pointer> &') for 1st argument
iterator(std::list<Piece>::iterator& rhs){data = rhs;}
^
./PieceList.h:26:5: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
iterator(){}
^
我认为这是代码的相关部分:
class PieceList
{
public:
PieceList(){}
PieceList(PieceList& rhs){pieces = rhs.pieces;}
PieceList(std::list<Piece>& rhs){pieces = rhs;}
friend std::ifstream& operator>>(std::ifstream&,PieceList&);
friend std::istream& operator>>(std::istream&,PieceList&);
class iterator
{
public:
friend class PieceList;
iterator(){}
iterator(iterator& rhs){data = rhs.data;}
iterator(std::list<Piece>::iterator& rhs){data = rhs;}
Piece operator*(){return *data;}
iterator& operator=(iterator& rhs){data=rhs.data;return *this;}
iterator& operator=(std::list<Piece>::iterator& rhs){data = rhs;return *this;}
bool operator==(iterator& rhs){return data==rhs.data;}
bool operator==(const iterator& rhs) const{return data==rhs.data;}
bool operator!=(iterator rhs){return data != rhs.data;}
iterator& operator++(){++data;return *this;}
iterator& operator--(){--data;return *this;}
private:
std::list<Piece>::iterator data;
};
iterator first(){iterator i;i.data=pieces.begin();return i;}
iterator last(){iterator i;i.data=pieces.end();return i;}
private:
std::list<Piece> pieces;
};
所以我知道它不喜欢第二个构造函数,但我不确定如何修复它。我无法通过谷歌搜索错误来理解我的任何谷歌结果。谁能指出我正确的方向?
最佳答案
您不能将临时变量绑定(bind)到非常量引用。
iterator(iterator const& rhs) : data(rhs.data) {}
iterator(std::list<Piece>::iterator rhs) : data(rhs) {}
请注意,迭代器通常按值传递
#include <iterator>
#include <list>
#include <string>
#include <iostream>
struct Piece {
std::string name;
};
class PieceList
{
public:
PieceList(){}
PieceList(PieceList const& rhs){pieces = rhs.pieces;}
PieceList(std::list<Piece> const& rhs){pieces = rhs;}
friend std::ifstream& operator>>(std::ifstream&,PieceList&);
friend std::istream& operator>>(std::istream&,PieceList&);
class iterator
{
public:
friend class PieceList;
iterator(){}
iterator(iterator const& rhs) : data(rhs.data) {}
iterator(std::list<Piece>::iterator rhs) : data(rhs) {}
Piece operator*(){return *data;}
iterator& operator=(iterator& rhs){data=rhs.data;return *this;}
iterator& operator=(std::list<Piece>::iterator& rhs){data = rhs;return *this;}
bool operator==(iterator& rhs){return data==rhs.data;}
bool operator==(const iterator& rhs) const{return data==rhs.data;}
bool operator!=(iterator rhs){return data != rhs.data;}
iterator& operator++(){++data;return *this;}
iterator& operator--(){--data;return *this;}
private:
std::list<Piece>::iterator data;
};
iterator first(){iterator i;i.data=pieces.begin();return i;}
iterator last(){iterator i;i.data=pieces.end();return i;}
private:
std::list<Piece> pieces;
};
int main() {
PieceList pl { {
{ "aap" },
{ "noot" },
{ "mies" },
} };
for(auto it=pl.first(); it!=pl.last(); ++it) {
std::cout << (*it).name << "\n";
}
}
打印
aap
noot
mies
PieceList
的构造函数也有类似的问题。您的迭代器类也缺少 operator->
。我将其保留为 ExerciseForTheReader™
关于c++ - 如何解决有关迭代器构造函数的一系列错误,涉及预期左值、缺少转换和可行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495163/
我是 C++ 的新手,正在尝试编写如下接口(interface): template class Comparable { protected: Comparable(){};
什么是左值? 最佳答案 左值是可以分配给以下值的值: lvalue = rvalue; 它是“left value”或“lefthand value”的缩写,它基本上只是=符号左侧的值,即您为其分配值
这个问题已经有答案了: Why do C and C++ support memberwise assignment of arrays within structs, but not general
C++03 $14.1/6 - "A non-type non-reference template-parameter is not an lvalue." C++0x $14.2/6- "A no
这只是出于好奇我问... 我在任何地方看到的 99% 的代码,当使用“IF”时,将采用“If (RValue == LValue) ...”格式。例子: If (variableABC == "Hel
在 C++03 中,表达式可以是右值,也可以是左值。 在 C++11 中,表达式可以是: 右值 左值 x值 gl值 右值 两个类别变成了五个类别。 这些新的表达类别是什么? 这些新类别与现有的右值和左
我正在尝试将 div 向左移动指定数量的像素,我正在使用从此处获得的 slider : http://carpe.ambiprospect.com/slider/archive/v1.3/ 所以从示例
所以我有一个函数需要将 std::vector 作为参数。我想知道声明参数的最佳方式,这样底层数组就不会被深度复制,因为它可能相当大。 // which should I choose? void m
在 C++03 中,表达式要么是右值,要么是左值。 在 C++11 中,表达式可以是: 右值 左值 xvalue glvalue 右值 两类变成了五类。 这些新的表达类别是什么? 这些新类别与现有的右
我正在尝试实现类似 find 的方法来从容器中提取对值的引用,如果找不到该值或该值的类型不兼容,则返回一个默认值。 template const T& get (key_type k, const T
我有以下代码: #include using namespace std; void test(int& a) { cout << "lvalue." << endl; } void tes
我的搜索发现许多关于右值绑定(bind)到左值的帖子,但没有任何类似的帖子。对不起,如果它是重复的。 struct StrHolder { StrHolder(std::string&& s)
这是一个后续问题 C++0x rvalue references and temporaries 在上一个问题中,我问过这段代码应该如何工作: void f(const std::string &);
为什么这不起作用: ostream& operator' lvalue to 'std::basic_ostream&&'| error: initializing argument 1 of '
偶尔,我被问到一个技巧问题:x++ 和 ++x 哪个不能在 c 中留值?很多人告诉我++x不能,因为++x的汇编代码不返回寄存器。我对此表示怀疑。所以我做了一些实验。 C 代码: #include
所以这个问题与我为实际问题选择的解决方案有关,为了尽可能提供完整的图片,这个问题是这样的:基本上我有一个带有很多模板参数的函数,我正在尝试暴露给 Python。与用宏做一些噩梦般的事情来消除我需要的所
指针很简单。有一些内存保存着一个地址。要获得(有意义的)值,取消引用返回地址指向的内存中包含的值。 引用以某种方式做一些类似的事情:它们持有指向一个临时对象的“链接”。但是当我分配或使用引用时会发生什
下面是一些示例代码: #include class Foo { public: explicit Foo(int x) : data(x) {}; Foo& operator++() {
背景 以下代码块出现在 Scott Meyers 的名著 "Effective C++" 中第 3 项: class TextBlock { public: ... const cha
我是一名优秀的程序员,十分优秀!