BUG: C2059 Initializing Static Data Member of a Template Class

ID: Q179273


The information in this article applies to:


SYMPTOMS

The compiler generates the following errors when compiling the sample code shown below (the code initializes a static data member of a template class):

C2059: syntax error : syntax error : 'string'
C2063: 'identifier' : 'r' : not a function
C2040: 'operator' : 'r' : 'class Register (void)' differs in levels of indirection from 'class Register'


RESOLUTION

To work around this problem, use the assignment operator when initializing the static data member of a template class.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.


MORE INFORMATION

The following sample code demonstrates the problem and the workaround:


   /* Compile options needed: none
   */ 

   #include <stdio.h>

   class Register {
   public:

       Register( const char* class_name )
       { printf("In Register ctor for class %s.\n", class_name); }
       ~Register()
       { printf("In Register dtor.\n"); }

   };

   template<class T>
   class Base {
   public:

       static Register r;

   };


  template<class T>
   Register Base<T>::r( "Base<T>" ); //Cause of C2059, C2063 and C2040

   // To work around the problem, comment the line above and
   // uncomment the following line:
   // Register Base<T>::r = Register("Base<T>");

   int main() {
       return 0;
   } 

Additional query words: initializer


Keywords          : kbVC500bug kbVC600bug 
Version           : winnt:5.0,5.0sp1,5.0sp2,5.0sp3,6.0
Platform          : winnt 
Issue type        : kbbug 

Last Reviewed: July 26, 1999