11

私のアプリケーションでは、次のクラス階層があります。

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': [ T=Word ]の'Dictionary'
のメンバーではありません


テンプレートから派生したWordDictionaryクラスをQ_OBJECTにするために、その中にテンプレート関数をハードコーディングして大量の定型コードを生成する以外にできることはありますか?

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

template <typename T> class Dictionary : public QObject

コードをコンパイルしました。私が愚かなことをしていないかどうか、そしてこれが正しく機能するかどうかはわかりませんが。

4

1 に答える 1

15

これを直接行うことはできませんが、使用可能な回避策があります。こちらの記事をご覧ください。

mocがテンプレートを処理することは理論的には可能ですが、実装は非常に複雑であり、使用するのは非常に非現実的です。テンプレートのインスタンス化ごとに、mocは適切なメタオブジェクトコードを生成する必要があり、生成されたコードはリンクユニットごとに1回含まれる---テンプレートクラスが異なるコンパイルユニットで同じテンプレートパラメータとともに使用されると、これを維持するのは悪夢になります。

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

于 2010-11-21T14:04:19.387 に答える