尝试使用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不是Class1Class3的关联类,并且您的operator<<并未声明为类外,因此无法通过名称查找c1 << c3来找到它。在不知道存在这种operator<<的情况下,隐式转换根本就没有发挥作用。

09-06 21:14
查看更多