0

正直なところ、私はその問題に名前を付ける方法を本当に知りません。動作していないコードを表示します。

template<int SIZE>
struct bar{

};

template<int SIZE>
struct foo{
    template<int X>
    void f(bar<X> b);
};

template<int SIZE, int X>
void foo<SIZE>::f(bar<X> b){

}


int main(){
    foo<1> f;
    bar<2> b;
}

循環依存の問題を回避するために、定義を実装から分離したいと思います。分離はヘッダーファイルでのみ行われます。テンプレートコードをcppファイルに入れたくありません。その場合、ポインタを使用することはできません。リファクタリングが検討されていますが、実際のオプションでもありません。

テンプレートパラメータ自体を持つパラメータなしでfoo::fを実装すると、正常に機能します。ただし、そのパラメータでは実際には問題は発生しません。

コードはgcc4.7および(さらに重要な)Visual Studio2010を使用して機能するはずです。C++11は、前述のプラットフォームでサポートされている限り問題ありません。

解決策、回避策、および私が完全に間違ったことをしている理由の理論的説明は高く評価されます。TIA。

4

4 に答える 4

7
template<int SIZE, int X>    //problem : what is what here?
void foo<SIZE>::f(bar<X> b){

}

構文が間違っています。

正しい構文は、次のようにtemplate2回使用することです。

template<int SIZE>   //for the class template
template<int X>      //for the member function template
void foo<SIZE>::f(bar<X> b){

}

ここでは順序が重要であることに注意してください。

于 2012-06-18T12:02:19.837 に答える
5

これは正しい構文です:

template<int SIZE>
template<int X>
void foo<SIZE>::f(bar<X> b){

}

fooそれ以外の場合は、2つのテンプレート引数を取るクラステンプレートであると言っています。

于 2012-06-18T12:01:56.947 に答える
4

テンプレートには2つのレベルがあり、別々に指定する必要があります

template<int SIZE>
template<int X>
void foo<SIZE>::f(bar<X> b){  }
于 2012-06-18T12:03:13.310 に答える
0

循環依存があなたの主な問題です。本当に必要ですか?依存関係が有向非巡回グラフを形成する方法で問題を解決してみてください。多くの場合、より良い解決策が得られます。

循環依存を破ることができない場合は、2つのテンプレートが異なるコンポーネント(この場合はヘッダー)にあるかどうかを再検討する必要があります。これは、2つが他のテンプレートなしでは有効ではないように見えるためです。

于 2012-06-18T12:04:05.143 に答える