コンパイラ エラー C3206

更新 : 2007 年 11 月

エラー メッセージ

'関数' : '型' 引数は 'param' に対して無効です。'型' 引数リストがクラス '型' 'typenema' に存在しません

テンプレート関数は、テンプレート型引数を受け取るように定義されていますが、テンプレートのテンプレート引数が渡されました。

次の例では C3206 エラーが生成されます。

// C3206.cpp
template <class T>
void f() {}

template <class T>
struct S {};

void f1() {
   f<S>();   // C3206
   // try the following line instead
   // f<S<int> >();
}

解決方法 :

// C3206b.cpp
// compile with: /c
template <class T>
void f() {}

template <class T>
struct S {};

void f1() {
   f<S<int> >();
}

C3206 は、ジェネリックを使用しているときも発生します。

// C3206c.cpp
// compile with: /clr
generic <class GT1>
void gf() {}

generic <class T>
value struct GS {};

int main() {
   gf<GS>();   // C3206
}

解決方法 :

// C3206d.cpp
// compile with: /clr
generic <class GT1>
void gf() {}

generic <class T>
value struct GS {};

int main() {
   gf<GS<int> >();
}

このエラーは、クラス テンプレートをテンプレート型引数として使用できなくなった Visual C++ .NET 2003 で行ったコンパイラ準拠作業の結果として生成されることもあります。

クラス テンプレートは、テンプレート型引数として使用できません。これは Visual C++ .NET 2003 では機能しますが、C++ では無効です。

詳細については、「Summary of Compile-Time Breaking Changes」を参照してください。

次のコード例は、Visual C++ .NET 2002 ではコンパイルされますが、Visual C++ .NET 2003 ではエラーになります。

// C3206e.cpp
template <class T>
struct S {};

template <class T>
void func() {   // takes a type
   T<int> t;
}

int main() {
   func<S>();   // C3206 S is not a type.
}

解決方法 :

// C3206f.cpp
template <class T>
struct S {};

template <class T>
void func() {   // takes a type
   T t;
}

int main() {
   func<S<int> >();
}

テンプレートのテンプレート パラメータが必要な場合、Visual C++ .NET 2003 と Visual C++ .NET 2002 の両方のバージョンで有効なエラーの解決方法は、テンプレートのテンプレート パラメータを受け取る関数をテンプレート クラスにラップすることです。

// C3206g.cpp
template <class T>
struct S {};

template<template<class> class TT>
struct X {
   static void func() {
      TT<int> t1;
      TT<char> t2;
   }
};

int main() {
   X<S>::func();
}