2

メソッドテンプレートを持つクラスがあるとします。

//file: X.h
class X{

    int x;
    //... more members and non-template functions

    template<typename T>
    void foo(T t){ //Error, cannot define the method here. Declaration is okay
        Y y = ...;
    }
}

//file Y.h
class Y {
    X x;
}

循環クラスの依存関係(fooの本体はYに依存し、YはXに依存する)のため、foo宣言した場所のメソッドテンプレートを定義できません(今すぐ設計に疑問を持たないでください)。

fooでは、この場合の定義はどこに置くのでしょうか?他の定義に.cppファイルに入れることができないか、リンクが失敗します。

私の解決策は、「X.hpp」などの新しいヘッダーファイルを作成し、それにテンプレートメソッドの定義のみを追加することです。このファイルには、「Xh」と「Yh」が含まれています。これで、クラスXが必要なときはいつでも、「X.hpp」だけを含めるだけで、他の必要なhファイルが含まれます。

だから私の質問は:これはそれを行うための正しい/最良の方法ですか?単一のメソッドテンプレート定義のみの.hppファイルがあるのはどういうわけか私を悩ませますが、循環型の依存関係の場合に可能な唯一の方法のようです。もう一度お願いします。「循環型の依存関係を避けるのが最善だ」などと言ってデザインに疑問を投げかけないでください。問題は、これらの依存関係がある場合、単一のメソッドテンプレートを処理するための最良の方法は何ですか。

4

1 に答える 1

5

デザインを疑うことなく:

//file: X.h
#ifndef X_H
#define X_H
class X{

    int x;
    //... more members and non-template functions

    template<typename T>
    void foo(T t);
};

#include "Y.h"

template<typename T>
void X::foo(T t){ //Error, cannot define the method here. Declaration is okay
    Y y = ...;
}

#endif


//file Y.h
#ifndef Y_H
#define Y_H

#ifndef X_H
#error "Please include X.h"
#endif

class Y {
    X x;
}

#endif

余分なファイルは必要ありません。

于 2012-08-27T12:52:41.110 に答える