C ++隐式转换不起作用

时间:2016-02-08 01:13:02

标签: c++ c++11 casting implicit-conversion

用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);
}

任何想法我做错了什么? 请帮忙!感谢。

1 个答案:

答案 0 :(得分:5)

在类定义中定义的

friend函数,没有类外声明,仅对参数依赖查找可见,并且只有在定义它们的类是关联类<时才可见/ em>其中一个论点。

Class2不是Class1Class3的关联类,并且您的operator<<未在类外声明,因此未按名称找到查找c1 << c3。在不知道存在这样的operator<<的情况下,隐式转换根本不起作用。