4

テンプレートを使った実験で、紛らわしい苦境に遭遇しました。Fデフォルトの引数がであるテンプレート構造体を定義していますint。テンプレート化されたメンバー関数がありますg。構造体定義の下で定義しています。これが正しい方法だと思いましたが、エラーが発生します。そして、たった1つのエラー:

prog.cpp:9:62:エラー:'void F <> :: g()'を囲むクラスのテンプレートパラメータのデフォルト引数

template <typename = int> struct F {

    template <typename> void g();

};

template <typename T = int> template <typename> void F<T>::g() {}

int main() {

    F<>f;

}

かなりあいまいです。それが何を意味するのか正確には理解できませんでした。だから私はいくつかのことを変えてみました。の定義のデフォルトのテンプレート引数であると思いましたF。だから私は変更しました:

template <typename = int> struct F {

template <typename T = int> struct F {

gテンプレート引数を与えてみました:

template <typename T = int> template <typename U> void F<T>::g<U>() {}

しかし、その後、エラーが発生しました。

prog.cpp:9:67:エラー:関数テンプレートの部分的な特殊化'g'は許可されていません
prog.cpp:9:67:エラー:'void F :: g()'を囲むクラスのテンプレートパラメータのデフォルト引数

gテンプレート関数であると指定してみました。

template <typename T = int> template <typename U> void F<T>::template g<U>() {}

しかし、それは役に立ちませんでした。私は何が間違っているのですか?

4

1 に答える 1

9

デフォルトのテンプレートパラメータは、定義ではなく、関数宣言でのみ使用する必要があります。

template <typename T/* = int*/> template <typename> void F<T>::g() {}
于 2012-10-20T13:55:40.870 に答える