C++ 重载运算符i/o问题
我试图重载运算符>>,但在尝试编译时出现了一个大错误C++ 重载运算符i/o问题,c++,io,overloading,istream,C++,Io,Overloading,Istream,我试图重载运算符>>,但在尝试编译时出现了一个大错误 std::istream& operator>>(std::istream & is) { string str; is>>str; vector<Cord> v; cout<<str<<endl; bool test=testeur(str, v); if (test) { for (unsigned int i=0;i<v.size();i++)
std::istream& operator>>(std::istream & is)
{
string str;
is>>str;
vector<Cord> v;
cout<<str<<endl;
bool test=testeur(str, v);
if (test)
{
for (unsigned int i=0;i<v.size();i++)
table.push_back(v[i]);
}
return is;
}
我得到这个错误:test.cpp:473:9:error:tmp2>>x1中的“operator>>”不匹配
考试。cpp:473:9:注:考生为:
现在我试着这样做:
friend std::istream& operator>>(std::istream & is, const CGPS & rhs)
{
string str;
is>>str;
vector<CCoord> v;
cout<<str<<endl;
bool test=testeur(str, v);
if (test)
{
for (unsigned int i=0;i<v.size();i++)
rhs. Add (v[i]);
}
return is;
}
friend std::istream&operator>>(std::istream&is,const CGPS&rhs)
{
字符串str;
is>>str;
向量v;
cout操作符必须是自由函数,因为它的左侧是流
因此,您需要实施
std::istream& operator>>(std::istream& is, YourClass& x);
调用实现的语法如下
x1 >> tmp2;
看起来很奇怪
增编:
您在更新的代码中犯了两个错误:
CGPS
参数不能是const
(它是您正在读取的对象,因此您将对其进行修改)
testeur
显然是CGPS
的一个成员函数,因此您应该像rhs.testeur(str,v)
那样调用它
运算符>>函数不能是类的成员函数,因为第一个参数必须是istream而不是this
试试这个:
friend std::istream& operator>>(std::istream & is, MyClass & rhs)
{
input the data here (you have access to private data)
return is;
}
或者,如果您只需要MyClass的公共成员来访问所需的数据,则可以将其设置为同一命名空间中的独立自由函数。如果没有“friend”,则声明的外观将相同。它应该出现在类的声明之外,并且您可能需要将其内联
澄清:您(至少)有三个选择:
- 将函数声明(并定义)为友元函数。它甚至不是类成员
尽管定义出现在类声明中。
- 通过此选项,您可以访问类中的私有数据
- 将函数声明(并定义)为与类位于同一头文件中(且位于同一命名空间中)但在类声明之外的内联函数,并且仅使用类上的公共方法来设置读取的值
- 在与类相同的头文件中声明函数。在cpp文件中定义函数体。区别在于函数不是内联的
对于所有这些选择,运算符>>函数都是独立的,不是类的成员。我猜这是一个成员函数。它必须是一个自由函数,因此std::istream&
是第一个参数。谢谢。我不明白你的意思。对不起,你现在正试图从自由函数调用CGPS类的方法,而不提供实例。它可能应该是bool test=rhs.testeur(str,v),所以你要在实例中调用方法。而且,你要修改实例<代码> RHS,所以你应该把一个非const引用传递给操作员。不要批评,但是你以前写过很多C++吗?这看起来好像你要在你走之前就试着跑。我确实是初学者,现在看来是有效的,谢谢。代码已过期,但仍然存在错误。您的意思是我必须在类之外实现此函数?如果您将函数声明为friend,则即使该声明出现在类声明中,它也不是该类的成员。我有一个“const”这是一个错误,因为这个函数需要更改MyClass(我认为是运算符),是的,它必须是相反的东西:tmp2>>x1;
friend std::istream& operator>>(std::istream & is, MyClass & rhs)
{
input the data here (you have access to private data)
return is;
}