2010-11-21 14 views
10

私のアプリケーションでは、次のクラス階層があります。テンプレート由来のC++クラスとQtのQ_OBJECTを混在させることは可能ですか?

class Word 
{ 
    ... 
} 

template <typename T> class Dictionary 
{ 
    ... 
}; 

class WordDictionary : public Dictionary<Word> 
{ 
    Q_OBJECT 

    ... 
} 

WordDictionaryクラスは、長い時間がかかる辞書を解析します。私は別のスレッドの中から解析関数を実行していますが、解析中の現在の行番号に基づいて進行状況の更新を提供するためにGUIスレッドに時々信号を送ることができるようにします。だから私はそれをQ_OBJECTにしたい。私は基本クラス辞書をQ_OBJECTにしようとしましたが、Q_OBJECTテンプレートがサポートされていないというメッセージがありました。 WordDictionaryのみをQ_OBJECTとして残してマクロを削除すると、一般的な形式のエラーメッセージが表示されます。

。\ GeneratedFiles \ Release \ moc_dictionary.cpp(44):エラーC2039: 'staticMetaObject': 'Dictionary'のメンバーではない

[
T = Word
]

テンプレート由来のWordDictionaryクラスをテンプレート関数のハードコード以外のQ_OBJECTにするためにできることはありますかそれの中で、定型コードをたくさん作り出していますか?

編集:テンプレート宣言を次のように変更します。

template <typename T> class Dictionary : public QObject 

はコードをコンパイルしました。私は愚かな何かをしていない場合、これが正しく動作するかどうかはわかりません。

+0

[信号とスロットにQtテンプレートを使用しないのはなぜですか] –

答えて

14

これは直接行うことはできませんが、使用可能なワークラウンドがあります。記事hereを参照してください。

MOCは、テンプレートを処理することが理論的には可能ですが、それは実装する が非常に複雑になり、そして が使用する非常に実用的ではない: を各テンプレートのインスタンス化のために、MOC は、適切なを生成する必要があります メタオブジェクトコード、生成 コードが一度 クラスが異なるコンパイル に同じテンプレート パラメータで使用されるテンプレート一旦維持する 悪夢となるリンクユニット---あたりに含まれなければなりません単位。

シグナルとスロットは プロトタイプの一部であることを にテンプレートパラメータを必要としない場合は、この問題を回避するには、テンプレートクラスが 必要なシグナルとスロットを提供 QObjectのサブクラスを継承させる にあります。 信号とスロットで テンプレートパラメータを使用する必要がある場合は、Observer パターンを使用できます。

2

私はこのコードを試してみました、それがコンパイルし、[OK]を実行します:

#include <QtCore/QCoreApplication> 
#include <QObject> 

class Word 
{ 

}; 

template <typename T> class Dictionary 
{ 

}; 

class WordDictionary : public Dictionary<Word>, QObject 
{ 
    Q_OBJECT 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    WordDictionary wd(); 
    return a.exec(); 
} 

は、私は何かが欠けてることができますか?

+0

これにより、問題が発生することがあります。記事をチェックしてください私は議論のために引用した。 –

+0

@Steve:どのような問題がありますか?引用された記事では、QObjectからクラステンプレートを派生させようとすることについてのみ説明しています。これは、テンプレートインスタンスとQObjectからクラスを派生しています。私が見る唯一の問題は、mocは最初に継承されたクラスがQObjectのサブクラスであると仮定しているので、QObjectは継承リストの最初になければならないということです。 – baysmith

+3

QObjectを最初の基本クラスにするべきではありませんか? – zarzych

関連する問題