テンプレートを使った実験で、紛らわしい苦境に遭遇しました。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>() {}
しかし、それは役に立ちませんでした。私は何が間違っているのですか?