错误:'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&lt;&lt;’ (operand types are ‘std::ostream’ aka ‘std::basic_ostream&lt;char&gt;’ and ‘std::__cxx11::list&lt;int&gt;’)

【问题讨论】:

cout &lt;&lt; *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】:

我不认为错误消息真的属于导致问题的行(您之前尝试过&lt;&lt;-ing 列表本身吗?),但是

cout << currentVertices;

尝试使用std::ostream 引用(std::cout)和指向std::list 的迭代器调用operator &lt;&lt;。那是行不通的,因为迭代器类型没有这个运算符(为什么要这样)。但是,迭代器是在指针之后建模的,因此允许取消引用以访问它们所引用的元素。长话短说;这应该工作:

cout << *currentVertices;

其中currentVertices 前面的* 是取消引用并产生int&amp;(对基础列表元素的引用)。

【讨论】:

【参考方案3】:

currentVertices 是这里的迭代器。它是一个充当指针的对象。您不能使用cout 打印它。但是,是的,您可以打印出迭代器指向的值。为此,您必须在迭代器之前放置一个*。即*currentVertices。 (读作content of currentVertices

所以,总结是

    currentVertices 是一个迭代器(或指针,如果你想说的话),*currentVerticescontent of that iterator。 您需要cout content of iterator 而不是iterator

【讨论】:

同意,只是!你可以通过重载&lt;&lt;来打印指针,这不是一个好主意,有点可能:D 是的,但我试图尽可能简单地回答。所以我避免了运算符重载,并保持了默认的。 谢谢!!你救了我的命【参考方案4】:

正如其他人已经提到的那样

 cout << currentVertices;

尝试打印一个迭代器。但是operator&lt;&lt; 没有采用这种类型的第二个参数的重载。要么取消引用迭代器

 //      V
 cout << *currentVertices;

或简化整个循环:

for(const auto &currentVertices : currentFace->setofVertices)
    cout << currentVertices;

【讨论】:

以上是关于错误:'operator<<' 不匹配(操作数类型为'std::ostream' aka'std::basic_ostream<char>' 和'std::_List_iter的主要内容,如果未能解决你的问题,请参考以下文章

QVector 与 'operator=' 不匹配

如何完全绕过`错误:不匹配'operator =='`?

‘operator<<’ 不匹配(操作数类型是 ‘std::ostream’ aka ‘std::basic_ostream<char>’ 和 ‘const std::type

C ++ - 与'运算符不匹配

C ++重载:[错误]'operator ='不匹配(操作数类型是'String'和'String')[重复]

错误:与 'operator=' 不匹配。试图从基类继承并从基类初始化?