FIX: C2734, C2166: Caused by Template Function with const ref (167113)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Professional Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2b
  • Microsoft Visual C++, 32-bit Professional Edition 4.2b
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0

This article was previously published under Q167113

SYMPTOMS

The compiler generates the compiler error C2734 and C2166, when compiling a template function with a const reference of class T as an argument, where class T is a template parameter.
C2734: 'identifier' : const object must be initialized if not extern C2166: l-value specifies const object

STATUS

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

MORE INFORMATION

The following sample demonstrates the problem and the workaround.

Sample Code

    /* Compiler Options: None
    */ 
    //#define WORKAROUND1 // uncomment this line for workaround1
    //#define WORKAROUND2 // uncomment this line for workaround2

    template <class T>
    T Test (const T& arg1)

   {

    #ifndef WORKAROUND1
        T x ;
      x = arg1;
    #else
       T x = arg1 ; // WORKAROUND 1
    #endif

        return x;

   }

    int main()
   {
    #ifndef WORKAROUND2
        int testValue = Test ( 7 );
   #else
       int testValue = Test <int> ( 7 ); // WORKAROUND 2
   #endif

    return 0;
   }
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbBug kbfix kbVC600fix KB167113