1

戻り型でC++の関数をテンプレート化すると、次のようになります。

template<class T> T foo(int x) { };

明示的なテンプレートの特殊化を使用して、doubleインスタンスを作成できます。

template<> double foo<double>(int x) { };

前方宣言を使用して、未定義のインスタンスを作成しようとしましたstruct

struct bar;
template<> bar foo<bar>(int x) { }

これはで失敗しerror: return type ‘struct bar’ is incompleteます。前方宣言をいつ使用するかについての受け入れられた回答を読んだ後でも、これは許可されると思いました。なぜなら、のインスタンスを作成するまで、明示的なテンプレートコードは作成されないからです。明らかにそうではありません(なぜですか?)。foo<bar>

コンパイル時に型が存在しない可能性のある関数のコードを作成し、特定の明示的な特殊化がインスタンス化されている場合にのみコードをコンパイルすることは可能ですか?これの動機は、「オーバーロードされた」構造体リーダーであり、オーバーロード操作は、コンパイルの前に(スクリプトを介して)手続き的に生成されます。

4

2 に答える 2

2

foo関数の本体を提供しない場合は、これを行うことができます。

// some header file, probably
struct bar;
template<> bar foo<bar>(int x);

// somewhere else:

struct bar { 
    //blabla 
};

// the actual implementation
template<> bar foo<bar>(int x) {
    // do something
}

前方宣言は、実際にの定義を必要としない場合にのみ機能しますbarfoo関数の本体では、その構造体のサイズを知る必要があります。そのため、コードは機能しませんでした。

于 2012-06-11T16:09:35.093 に答える
2

関数の特殊化を定義するときは、関数テンプレートではなく、関数を定義します。この時点でのルールは、通常の関数の場合とまったく同じです。完全な型を必要とする方法で型を使用しているため、の定義がないため、プログラムの形式が正しくありません。bar

(returnステートメントがないため、プログラムの形式も正しくありません...)

于 2012-06-11T16:10:47.900 に答える