【问题标题】:C++ implicit conversion does not workC++ 隐式转换不起作用
【发布时间】:2016-02-08 01:13:02
【问题描述】:

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

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

【问题讨论】:

  • 您还没有为 Class3 定义 &lt;&lt; 运算符重载,因此 g++ 不喜欢它。您将 Class3 c3 转换为 Class2,这是您实现的已定义转换运算符。 g++ 喜欢它,因为你定义了它。像 g++ 一样。
  • 你得到什么错误信息?
  • @Poriferous 我看不出这有什么解释。
  • > 你得到什么错误信息
  • main.cpp: In function 'int main()': main.cpp:19:6: error: no match for 'operator

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


【解决方案1】:

friend 在类定义中定义的函数,没有类外声明,仅对依赖于参数的查找可见,并且仅当定义它们的类是关联类 论据之一。

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

【讨论】:

  • 确实,这似乎在一个小测试中起作用:` inline Class1 & operator
  • 好的,让它在我正在处理的主代码分支中工作......谢谢你,你的答案是正确的。但是,现在,有谁知道为什么该语言会有如此烦人的限制?为了让我的代码库正常工作,我不得不将所有“运算符
  • 当您说关联时,您的意思是“具有直接继承”吗?该术语在应用于 C++ 时存在一些歧义:[programmers.stackexchange.com/questions/255973/…
  • @personal_cloud : "我不得不把所有的 "operator" 他们不应该移出命名空间,它们应该与您正在为其编写运算符的类型位于同一命名空间中。
  • @T.C.谢谢你的解释。如果有某种方法可以以某种方式将“operatoroutside 命名空间似乎是落后的,即使它确实是 Class2 的一个特性。
猜你喜欢
  • 2018-11-19
  • 2013-08-11
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多