Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符i/o问题_C++_Io_Overloading_Istream - Fatal编程技术网

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