2013-07-17 56 views
0

我有一个类和类似的类的内部的结构:过载操作者<< and >>在C++结构

class MyClass : public QObject 
{ 
public: 
    .... 

    struct MyStruct 
    { 
     quint8 val1; 
    } 
}; 

我想重载运营商< <和>>为结构,但我不不知道该怎么做。目前,我做这样的:

class MyClass : public QObject 
{ 
public: 
    .... 

    struct MyStruct 
    { 
     quint8 val1; 

     QDataStream &operator<<(QDataStream &out, const MyStruct& _myStruct) 
     { 
      out << _myStruct.val1; 
      return out; 
     } 

     QDataStream &operator>>(QDataStream &in, MyStruct& _myStruct) 
     { 
      in >> _myStruct.val1; 
      return in; 
     } 
    }; 
}; 

,但它是不正常

+0

[操作符重载(http://stackoverflow.com/questions/4421706/operator-overloading) – chris

回答

3

你需要为friend声明运营商:

 friend QDataStream &operator<<(QDataStream &out, const MyStruct& _myStruct) 
     { 
      out << _myStruct.val1; 
      return out; 
     } 

     friend QDataStream &operator>>(QDataStream &in, MyStruct& _myStruct) 
     { 
      in >> _myStruct.val1; 
      return in; 
     } 
+0

我尝试将操作员声明为朋友;这对运营商是可以的<<但运营商有这个错误>> erreur:'in >> _myStruct.val1'中'operator >>'不匹配 – federem

+0

对不起,可以,需要清理解决方案 – federem

1

我想添加QDataStream为你的类成员与被罚款。在您所指的上下文中,Operator >>只接受一个参数。下面是代码:

class MyClass : public QObject 
{ 
private: 
QDataStream in; 
QDataStream out; 
... 

public: 
    .... 

    struct MyStruct 
    { 
     quint8 val1; 

     QDataStream &operator<<(const MyStruct& _myStruct) 
     { 
      out << _myStruct.val1; 
      return out; 
     } 

     QDataStream &operator>>(MyStruct& _myStruct) 
     { 
      in >> _myStruct.val1; 
      return in; 
     } 
    }; 
}; 
+0

我希望OP想说'someQDataStream << MyStructObj;'。 – chris

+0

@chris可以。我明白你的意思。你的意思是重载操作符<<而不继承QDataStream类和参数传递。将操作员声明为朋友的答案适合您的问题。 – lulyon

2

通常你在相同的命名空间范围为类型指定的经营者为非成员函数他们正在尝试输出。这是为了允许argument-dependent-lookup使用。

class MyClass { [...] 
}; 

QDataStream& operator<<(QDataStream& qstr, MyClass::Mystruct const& rhs) { 
    [...] 
    return qstr; 
}