다음을 통해 공유


컴파일러 오류 C3206

업데이트: 2007년 11월

오류 메시지

'function' : 'param'에 대한 형식 인수가 잘못되었습니다. 클래스 형식 'typename'에 형식 인수 목록이 없습니다.
'function' : invalid type argument for 'param', missing type argument list on class type 'typename'

템플릿 함수가 템플릿 형식 인수를 사용하는 것으로 정의되었는데 템플릿 템플릿 인수가 전달되었습니다.

다음 샘플에서는 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++에서는 허용하지 않습니다.

자세한 내용은 컴파일 타임의 주요 변경 내용 요약을 참조하십시오.

다음 샘플은 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();
}