错误:'operator<<' 不匹配(操作数类型为'std::ostream' aka'std::basic_ostream<char>' 和'std::_List_iter
Posted
技术标签:
【中文标题】错误:\'operator<<\' 不匹配(操作数类型为\'std::ostream\' aka\'std::basic_ostream<char>\' 和\'std::_List_iterator<int>\')【英文标题】:error: no match for ‘operator<<’ (operand types are ‘std::ostream’ aka ‘std::basic_ostream<char>’ and ‘std::_List_iterator<int>’)错误:'operator<<' 不匹配(操作数类型为'std::ostream' aka'std::basic_ostream<char>' 和'std::_List_iterator<int>') 【发布时间】:2021-03-02 06:28:03 【问题描述】:您好,我正在尝试打印整数列表,但我不断收到该错误。
我有一个结构,上面有一个列表。
struct faceFiguration
int faceID;
list<int> setofVertices;
;
我有一个该结构的列表
list<faceFiguration> pattern;
这是我感到困惑的地方,我尝试在这里打印列表:
void PrintFaces()
currentFace = pattern.begin();
while(currentFace != pattern.end())
cout << currentFace -> faceID << endl;
for(auto currentVertices = currentFace->setofVertices.begin(); currentVertices != currentFace->setofVertices.end(); currentVertices++)
cout << currentVertices;
cout << '\n';
currentFace++;
这是完整的消息错误
error: no match for ‘operator<<’ (operand types are ‘std::ostream’ aka ‘std::basic_ostream<char>’ and ‘std::__cxx11::list<int>’)
【问题讨论】:
cout << *currentVertices;
标题和问题底部的错误信息不匹配,错字?
【参考方案1】:
你已经得到了告诉你取消引用迭代器的答案:
for(auto currentVertices = currentFace->setofVertices.begin();
currentVertices != currentFace->setofVertices.end();
currentVertices++)
cout << *currentVertices; // dereference
但是,您可以使用基于范围的 for 循环自动执行此操作:
for(auto& currentVertices : currentFace->setofVertices)
cout << currentVertices; // already dereferenced
【讨论】:
【参考方案2】:我不认为错误消息真的属于导致问题的行(您之前尝试过<<
-ing 列表本身吗?),但是
cout << currentVertices;
尝试使用std::ostream
引用(std::cout
)和指向std::list
的迭代器调用operator <<
。那是行不通的,因为迭代器类型没有这个运算符(为什么要这样)。但是,迭代器是在指针之后建模的,因此允许取消引用以访问它们所引用的元素。长话短说;这应该工作:
cout << *currentVertices;
其中currentVertices
前面的*
是取消引用并产生int&
(对基础列表元素的引用)。
【讨论】:
【参考方案3】:currentVertices
是这里的迭代器。它是一个充当指针的对象。您不能使用cout
打印它。但是,是的,您可以打印出迭代器指向的值。为此,您必须在迭代器之前放置一个*
。即*currentVertices
。 (读作content of currentVertices
)
所以,总结是
currentVertices
是一个迭代器(或指针,如果你想说的话),*currentVertices
是 content of that iterator
。
您需要cout
content of iterator
而不是iterator
【讨论】:
同意,只是!你可以通过重载<<
来打印指针,这不是一个好主意,有点可能:D
是的,但我试图尽可能简单地回答。所以我避免了运算符重载,并保持了默认的。
谢谢!!你救了我的命【参考方案4】:
正如其他人已经提到的那样
cout << currentVertices;
尝试打印一个迭代器。但是operator<<
没有采用这种类型的第二个参数的重载。要么取消引用迭代器
// V
cout << *currentVertices;
或简化整个循环:
for(const auto ¤tVertices : currentFace->setofVertices)
cout << currentVertices;
【讨论】:
以上是关于错误:'operator<<' 不匹配(操作数类型为'std::ostream' aka'std::basic_ostream<char>' 和'std::_List_iter的主要内容,如果未能解决你的问题,请参考以下文章
‘operator<<’ 不匹配(操作数类型是 ‘std::ostream’ aka ‘std::basic_ostream<char>’ 和 ‘const std::type