FIX: C4114 Warning When Using Templates and Const Keyword

ID: Q138752


The information in this article applies to:
  • Microsoft C/C++ Compiler (CL.EXE), used with:
    • Microsoft Visual C++ 32-bit Edition, versions 2.x4.0, 4.1, 4.2


SYMPTOMS

Using a class or function template may incorrectly generate a C4114 warning. The sample code in this article demonstrates a case where this occurs.


CAUSE

The compiler incorrectly expands the type of the function parameter to const T as it expands a template with type const T when the definition of a function or member function template has a parameter that takes a const T.

The Help file gives the following information for C4114:

  • Same type qualifier used more than once.


  • A type qualifier (const, volatile, signed, or unsigned) was used more than once in the same type declaration or definition. The second occurrence of the qualifier was ignored. This is a warning when Microsoft extensions are enabled (/Ze) and an error when extensions are disabled (/Za).


  • The following is an example of this warning:
    
       volatile volatile int i;   // warning 



RESOLUTION

This warning can be safely ignored. To disable all occurrences of this warning, use the #pragma warning preprocessor directive. The Help file demonstrates how to use this pragma.


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

Sample Code to Reproduce Problem


   // test.cpp
   // Compile options needed - none
   template <class T>
   struct f
   {
     void goo( const T & r){ T t=r;};
   };

   void main()
   {
       f<const int> h;

       // the following line of code causes
       // goo( const const int ) to be expanded
       h.goo( 2 );
   } 

Additional query words: kbVC400bug 2.00 2.10 2.20 9.00 9.10 10.00 10.10 10.20

Keywords : kbCompiler kbCPPonly kbVC kbVC500fix
Version : :2.x4.0,4.1,4.2
Platform : NT WINDOWS
Issue type : kbbug


Last Reviewed: January 31, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.