Microsoft KB Archive/168008

From BetaArchive Wiki
Knowledge Base


Article ID: 168008

Article Last Modified on 10/17/2003



APPLIES TO

  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition



This article was previously published under Q168008

SYMPTOMS

The compiler deduces incorrect type for a template parameter T, associated with a template function that takes a const reference of type T, causing the compiler error C2166 as follows:

l-value specifies const object

RESOLUTION

Do not use a literal when calling the template function. Instead, declare a variable, and pass the variable as an argument to the template function.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug has been corrected in Visual Studio 97 Service Pack 1.

For additional information about the Visual Studio 97 Service Pack 1, please see the following article in the Microsoft Knowledge Base:

170365 INFO: Visual Studio 97 Service Packs - What, Where, and Why


MORE INFORMATION

The following sample demonstrates the problem and a workaround.

Sample Code

   /*
   * Compiler Options: None
   */ 

   #define BUG
   //Workaround: comment the line above
   //Uncomment the following line
   //#define WORKAROUND

   template<class T> void Test(const T& x)
   {
      T y = x;
      if(y < 0)
         y = -y;
   }

   int main()
   {
   #ifdef BUG
      Test(3) ;
   #endif

   #ifdef WORKAROUND
      int n = 3 ;
      Test(n) ;
   #endif

      return 0 ;
   }
                

Keywords: kberrmsg kbbug kbfix kblangcpp kbvs97sp1fix kbcpponly kbcode kbcompiler KB168008