为什么编译器无法找到运算符<<。编译器在哪里查找运算符<<的定义当遇到线路时
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;
}
答案 0 :(得分:1)
这样在类中定义为朋友的函数具有相当不寻常的名称查找规则。他们是自由职能,但他们的名字属于他们所属的朋友。因此,它们只能通过依赖于参数的查找找到。
然而,要使其工作,至少有一个参数必须类似于对它所定义的类的对象的引用,或者在该类中定义的内容。
在您的情况下,参数是iostream
和vector<vector<int>>
,它们都与Foo
没有任何关系,因此编译器不使用依赖于参数的查找找到Foo
内的函数。
使其工作的显而易见的方法是在Foo
和Bar
的定义中包含Foo
和Bar
的重载,以及{{1的重载在任何类之外:
std::vector<vector<int>>