尝试使用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);
}
有任何想法我做错了吗?
请帮忙!谢谢。
最佳答案
在类定义内定义的friend
函数,没有类外声明,仅对依赖于参数的查找可见,并且仅当定义在其中的类是参数之一的关联类时才可见。Class2
不是Class1
或Class3
的关联类,并且您的operator<<
并未声明为类外,因此无法通过名称查找c1 << c3
来找到它。在不知道存在这种operator<<
的情况下,隐式转换根本就没有发挥作用。