2016-12-17 5 views
0

ストリーム演算子を既存のQtオブジェクトに追加することは可能ですか?私はこの例のコード(QFileSystemWatcher)でこれをやってみましたが、最後の行はコンパイルされません。 LineUserサンプルがコンパイルされます。ストリーム演算子をQtオブジェクトに追加する

Documentation for registering stream operators

error: use of deleted function ‘QFileSystemWatcher::QFileSystemWatcher(const QFileSystemWatcher&)’ 
       return new (where) T(*static_cast<const T*>(t)); 
note: ‘QFileSystemWatcher::QFileSystemWatcher(const QFileSystemWatcher&)’ is implicitly deleted because the default definition would be ill-formed: 
    class Q_CORE_EXPORT QFileSystemWatcher : public QObject error: ‘QObject::QObject(const QObject&)’ is private 
     Q_DISABLE_COPY(QObject) 
error: within this context class Q_CORE_EXPORT QFileSystemWatcher : public QObject note: declared here 
     Q_DISABLE_COPY(QObject) 
+0

代わりに 'QFileSystemWatcher *'のストリーム演算子を追加しようとすることを検討してください。 – dtech

+0

QFileSystemWatcher&* myObjのシグネチャはどうなっていますか? – Joelmob

答えて

1

hereから:

パブリックデフォルトコンストラクタを持つすべてのクラスまたは構造体、公共 コピーコンストラクタコンパイラメッセージが長い

#include <QtCore> 

class LineUser { 
public: 
    int uId; 
    QString passwd; 
    qint8 statusType; 
}; 

Q_DECLARE_METATYPE(LineUser) 
QDataStream &operator<<(QDataStream &out, const LineUser &myObj) { 
    out<<myObj.uId<<myObj.passwd<<myObj.statusType; 
    return out; 
} 
QDataStream &operator>>(QDataStream &in, LineUser &myObj) { 
    in>>myObj.uId>>myObj.passwd>>myObj.statusType; 
    return in; 
} 

QDataStream &operator<<(QDataStream &out, const QFileSystemWatcher &myObj) { 
    return out; 
} 
QDataStream &operator>>(QDataStream &in, QFileSystemWatcher &myObj) { 
    return in; 
} 

int main() { 
    qRegisterMetaTypeStreamOperators<LineUser>("LineUser"); 
    qRegisterMetaTypeStreamOperators<QFileSystemWatcher>("QFileSystemWatcher"); 
} 

、ここにいくつかの誤りがあります公共のデストラクタを登録することができます。

そしてhereから:

はQObjectは、コピーコンストラクタや代入演算子もありません。 これは仕様です。

だから明らかに、 QObjectメタタイプとして登録する派生防止設計上の制約がある(とメタ情報は、デフォルトでは彼らのために生成されることが必要ではないので、それはあまりにも理にかなっている)ので、 qRegisterMetaTypeStreamOperatorsがあり、いいえ。

QFileSystemWatcher *でも動作します。

関連する問題