用g ++ 5.3.1尝试C ++ 11已经有一段时间了......
我以为我理解隐式转换运算符。一般来说,
如果我定义Class3::operator Class2()
,那么我可以直接将Class3
传递给任何带Class2
的函数。这似乎
99%的时间工作......但我遇到了一个简单的例子
事实并非如此。
class Class1 {};
class Class2 {
public:
inline friend Class1 & operator<<(Class1 & a, Class2 const& c)
{return a;}
};
class Class3 {
public:
inline operator Class2() const {return Class2();}
};
void Foo(Class2 c) {}
int main()
{
Class1 c1;
Class3 c3;
// g++ does not like this:
// error: no match for 'operator<<' (operand types are 'Class1' and 'Class3')
// c1 << c3;
// g++ likes these just fine:
Foo(c3);
c1 << Class2(c3);
}
任何想法我做错了什么? 请帮忙!感谢。
答案 0 :(得分:5)
friend
函数,没有类外声明,仅对参数依赖查找可见,并且只有在定义它们的类是关联类<时才可见/ em>其中一个论点。
Class2
不是Class1
或Class3
的关联类,并且您的operator<<
未在类外声明,因此未按名称找到查找c1 << c3
。在不知道存在这样的operator<<
的情况下,隐式转换根本不起作用。