FIX: Exception Specification in Template causes C2961 Error (133071)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Learning Edition 4.0
  • Microsoft Visual C++, 32-bit Professional Edition 2.0
  • Microsoft Visual C++, 32-bit Professional Edition 2.1
  • Microsoft Visual C++, 32-bit Professional Edition 2.2
  • Microsoft Visual C++, 32-bit Professional Edition 4.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.1

This article was previously published under Q133071

SYMPTOMS

When you use an exception specification in a class or function template, the following error occurs:
error C2961: syntax error : 'throw' : unexpected token in template declaration

RESOLUTION

Remove the exception specification from the function declaration and definition. By design, it is not supported.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was corrected in Visual C++ version 5.0.

MORE INFORMATION

The use of exception specifications is not supported in this version of Microsoft C++. However, you would expect the compiler to generate the following warning instead of an error:
warning C4290: C++ Exception Specification ignored
This level 4 warning is generated as expected when using an exception specification in a non-templated class or function.

Sample Code to Generate Error C2961 and Demonstrate Problem

 /* Compile options needed: (none)
   */ 
   template <class T>
   class C1 {
   public:
        C1();
        void fn() throw();   // C2961 error - to work around, remove
        "throw()"
   };

   template <class T>
   void C1<T>::fn() throw()  // C2961 error - to work around, remove
   "throw()"
   {}
				

Sample Code to Generate Warning C4290 and Demonstrate Resolution

   /* Compile options needed: /W4
   */ 
   class C2 {
   public:
        C2();
        void fn() throw(); // compiler correctly generates C4290 warning
   };

   void C2::fn() throw()   // compiler correctly generates C4290 warning
   {}
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbbug kbcode kberrmsg kbfix kbLangCPP kbVC500fix KB133071