【问题标题】:Simple questions about cin/cout overloading 4关于cin/cout重载的简单问题4
【发布时间】:2013-07-17 13:03:48
【问题描述】:
#include <iostream>
#include <math.h>
#include <conio.h>

using namespace std;


class hugeint 
{
public:
    int size;
    int number[100];


    friend istream& operator>>(istream&,hugeint&);
    friend ostream& operator<<(ostream&,hugeint&);
};


istream& operator>>(istream& in,hugeint& c)
{
    // code not shown
    return in;
}


ostream& operator<<(ostream& out,hugeint& c)
{
    return out;
}


void main()
{
    system( "color 70" ); 

    hugeint o;
    hugeint y;
    hugeint z;

    cin >> o;
    cout<<"now y "<<endl;
    cin>>y;
}

编译器抱怨operator &gt;&gt; 模棱两可……我该怎么办?

【问题讨论】:

  • 它给出的错误是运算符 >> 模棱两可...我该怎么办?
  • 请修复您的源代码,使其真正可以运行。
  • main 在 C++ 中需要返回类型为 int
  • 您不应该在C++ 中包含C 标头,而应使用C++ 版本,例如#include &lt;math.h&gt; -> #include &lt;cmath&gt;
  • main() 必须返回 int

标签: c++ visual-c++ iostream


【解决方案1】:

不,the code compiles

但请注意,我确实也删除了您无关的和非 C++ 标头,并修复了您不正确的 main 返回类型。

【讨论】:

  • 请注意,好友查找规则在 C++11 中已更改,因此在 C++03 编译器上可能无法编译。
  • @DeadMG:ideone.com 的帖子正在 C++03 模式下运行。 Here's an example with GCC 4.3.2Here's an example in C++11 mode。有效,有效,有效!
  • @DeadMG “好友查找规则”是什么意思?在 C++03 和 C++11 中,[namespace.memdef]/3 “如果非本地类中的友元声明首先声明了一个类或函数,则友元类或函数是最内层封闭命名空间的成员。 "你指的是算子重载决议吗?
【解决方案2】:

尝试将operator&lt;&lt;operator&gt;&gt; 函数放在std 命名空间中

【讨论】:

  • 不,请不要。 已经有这样的答案了(已被发帖者删除)。首先,不允许在命名空间std中放置重载。其次,OP 代码中的运算符重载没有问题(请参阅 Lightness 的答案)。非限定名称查找和 ADL 将很高兴找到这个全局 operator &gt;&gt;,不存在歧义。
  • @DyP - 嗯,我见过将operator&lt;&lt; 放入namespace std 是唯一解决方案的情况。具体来说,如果 OP 的类位于其自己的命名空间中,则 operator&lt;&lt; 必须位于其中一个命名空间中。如果你想添加一个operator&lt;&lt;,例如std::vector,IIRC 你必须把它放在namespace std。 (g++不遵循标准,所以也在全局命名空间中查找,但是clang++遵循标准所以没有)
  • operator&lt;&lt; 放入namespace std 不是IMO 的解决方案——这是不允许的。我所知道的唯一有问题的情况是您在std::vector 的示例中提到的情况,即,如果二元运算符的两个参数都是命名空间std 的类型。因为该命名空间中有一些operator &gt;&gt; 函数,依赖于参数的查找将停止并开始重载解析,找不到任何全局operator &gt;&gt;。一种解决方法是将std::vector 包装在自己命名空间的包装器类型中。
  • 您也可以将整个vector 包装在类似于std::ref 的东西中,但是在您自己的/全局命名空间中(但这并不能解决所有问题)。至于参考:[namespace.std]/1“除非另有说明,否则如果 C++ 程序向命名空间 std 或命名空间 std 内的命名空间添加声明或定义,则其行为未定义。”
  • 好的。非常感谢!我想我周一还有一些工作要做:) 我也更好地理解为什么会这样:如果两个不同的人为vector 实现operator&lt;&lt;,你会得到冲突的定义,你不能用命名空间来修复。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多