为什么c ++编译器找不到运算符<<

时间:2017-07-25 06:38:24

标签: c++ c++11 vector operator-overloading

为什么编译器无法找到运算符&lt;&lt;。编译器在哪里查找运算符&lt;&lt;的定义当遇到线路时 cout <<f.some_func()<<endl;

错误: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::vector<std::vector<int> >’) cout <<f.some_func()<<endl;

some notes:.... error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ cout <<f.some_func()<<endl;

#include <iostream>
#include <string>
#include<vector>
using namespace std;

struct Bar
{
   int y;
};

class Foo
{
  int x;
  friend ostream & operator<<(ostream & os, Foo& f)
  {
      os << "Foo: " << f.x << endl;
      return os;
  }
  friend ostream & operator<<(ostream & os, Bar& b)
  {
      Foo f;
      os << "Bar b.y: " << b.y << endl;
      os << "Bar f.x: " << f.x << endl;

      return os;
  }
  friend ostream & operator<<(ostream & os, vector<vector<int> > const&  vec ){
      os << 5;
      return os;
  }

public:
  Foo(int x = 10):x{x}{}
  vector<vector<int> > some_func(){
    vector<vector<int> > abc(3, vector<int>(3));
    int x = 900;
    return abc;
  }
  //If I do this
  void wrapper(){
    cout << this->some_func() << endl;
  }

};


int main()
{
  Bar b { 1 };
  Foo f{ 13 };
  cout << f << endl;
  //cout << b << endl;
  cout <<f.some_func()<<endl;
  return 0;
}

1 个答案:

答案 0 :(得分:1)

这样在类中定义为朋友的函数具有相当不寻常的名称查找规则。他们是自由职能,但他们的名字属于他们所属的朋友。因此,它们只能通过依赖于参数的查找找到。

然而,要使其工作,至少有一个参数必须类似于对它所定义的类的对象的引用,或者在该类中定义的内容。

在您的情况下,参数是iostreamvector<vector<int>>,它们都与Foo没有任何关系,因此编译器不使用依赖于参数的查找找到Foo内的函数。

使其工作的显而易见的方法是在FooBar的定义中包含FooBar的重载,以及{{1的重载在任何类之外:

std::vector<vector<int>>