Knowledge Base

FIX: Function Style Conversion Incorrectly Generates Errors

Article ID: 115705

Article Last Modified on 7/5/2005


APPLIES TO


This article was previously published under Q115705

SYMPTOMS

When calling a class conversion function within a macro, as shown in the code below, the compiler may incorrectly generate the following errors:
error C2061: syntax error : identifier 'timeVal'
error C2066: cast to function type is illegal
error C2059: syntax error : ')'

RESOLUTION

Following are two possible workarounds for this problem:
  • Use temporary variables to hold an intermediate result.
    unsigned int tmp1, tmp2;
    
    tmp1 = WORD(timeVal);
    tmp2 = WORD(dateVal);
    m_dwVal = MAKELONG(tmp1, tmp2);
    -or-

  • Use a type cast operator instead of a conversion operator.
    m_dwVal = MAKELONG((WORD)timeVal, (WORD)dateVal);
    						

STATUS

Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

This problem was corrected in Microsoft Visual C++ .NET.

MORE INFORMATION

The following sample code demonstrates this problem.

Sample Code

/* Compile options needed: /c
*/ 

typedef unsigned short      WORD;
typedef unsigned long       DWORD;

#define LONG long

#define MAKELONG(low, high) ((LONG)(((WORD)(low)) |  \ 
                (((DWORD)((WORD)(high))) << 16)))

class CMyDate
{
public:
   operator WORD()
   {
      return m_wVal;
   }

private:
   WORD m_wVal;
};

class CMyTime
{
public:
   operator WORD()
   {
      return m_wVal;
   }

private:
   WORD m_wVal;
};

class CMyDateTime
{
   CMyDateTime(CMyDate dateVal, CMyTime timeVal)
   {
      m_dwVal = MAKELONG(WORD(timeVal), WORD(dateVal));

   // This call works in both, even though it is identical.

      m_dwVal= MAKELONG(timeVal.operator WORD(), dateVal.operator
               WORD());
   }

 private:
   DWORD m_dwVal;
};


				

Additional query words: kbVC400bug 8.00 8.00c 9.00

Keywords: kbbug kbfix kbnoupdate kbcpponly kbcompiler KB115705