+ -
当前位置:首页 → 问答吧 →  error C2593: 'operator <<' is ambiguous

error C2593: 'operator <<' is ambiguous

时间:2011-12-22

来源:互联网

#include <iostream>  
using namespace std;  
  
class Test  
{  
  public:  
  Test(int age = 0,char *name = "\0")  
  {  
  Test::age = age;  
  strcpy(Test::name,name);  
  }  
  void outmembers(ostream &out)  
  {  
  out<<"Age:"<<age<<endl<<"Name:"<<this->name<<endl;  
  }  
  friend ostream& operator <<(ostream& ,Test&);  
  protected:  
  int age;  
  char name[50];  
};  
ostream& operator <<(ostream& out,Test &temp)  
{  
  temp.outmembers(out);  
  return out;  
}  
int main()  
{  
  Test a(24,"管宁");  
  cout<<a;  
  system("pause");
return 0;
}
会出现
 error C2593: 'operator <<' is ambiguous
Error executing cl.exe.

date22_1.obj - 1 error(s), 0 warning(s)
错误,是编译器的问题吗?

作者: okmime   发布时间: 2011-12-22

既然你重载了 << ,
干嘛还弄个outmembers
把outmembers的代码copy到operator <<,删掉outmembers()
你叫outmembers()掉用你重载的<<的还是调用原来的呢?编译器怎么判断
如果outmembers()调用operator <<
operator <<又调用 outmembers 这也可以死循环哈

作者: erqieshi   发布时间: 2011-12-22

表示在vs2008上编的过

作者: woshiwaiwai   发布时间: 2011-12-22

引用 1 楼 erqieshi 的回复:
既然你重载了 << ,
干嘛还弄个outmembers
把outmembers的代码copy到operator <<,删掉outmembers()
你叫outmembers()掉用你重载的<<的还是调用原来的呢?编译器怎么判断
如果outmembers()调用operator <<
operator <<又调用 outmembers 这也可以死循环哈

这个不会陷入死循环,调用哪个<<要看<<后的参数,在它的outmembers里,没有使用Test作为<<的第二个参数,所有不会

作者: woshiwaiwai   发布时间: 2011-12-22

C/C++ code

#include <iostream>   
using std::ostream;  
using std::cout;
using std::endl; 
class Test
{   
public:   
  Test(int age = 0,char *name = "\0")   
  {   
  Test::age = age;   
  strcpy(Test::name,name);   
  }   
  void outmembers(ostream &out)   
  {   
  out<<"Age:"<<age<<endl<<"Name:"<<this->name<<endl;   
  }   
  friend ostream& operator <<(ostream& ,Test&);   
protected:   
  int age;   
  char name[50];   
};   
ostream& operator <<(ostream& out,Test &temp)   
{   
  temp.outmembers(out);   
  return out;
}   
int main()   
{   
  Test a(24,"管宁");   
  cout<<a;  
  system("pause");
  return 0;
}


这样就可以了,你用using namespace std里面已经包含了对<<定义,你继续重载<<,就会出现使用模糊的错误了

作者: shenxinji   发布时间: 2011-12-22

引用 4 楼 shenxinji 的回复:

C/C++ code

#include <iostream>
using std::ostream;
using std::cout;
using std::endl;
class Test
{
public:
Test(int age = 0,char *name = "\0")
{
Test::age = age;
strcpy(……

up

作者: elegant87   发布时间: 2011-12-22

引用 4 楼 shenxinji 的回复:

C/C++ code

#include <iostream>
using std::ostream;
using std::cout;
using std::endl;
class Test
{
public:
Test(int age = 0,char *name = "\0")
{
Test::age = age;
strcpy(……


是滴~~

作者: yafeng_jiang   发布时间: 2011-12-22