Knowledge Base

FIX: Exception Specification in Template causes C2961 Error

Article ID: 133071

Article Last Modified on 7/5/2005


APPLIES TO


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
   {}
				

Additional query words: 9.0 9.00 9.1 9.10 9.2 9.20

Keywords: kberrmsg kbbug kbfix kblangcpp kbvc500fix kbcode KB133071