Article ID: 113118
Article Last Modified on 7/5/2005
APPLIES TO
- Microsoft C/C++ Professional Development System 7.0
- Microsoft Visual C++ 1.0 Professional Edition
- Microsoft Visual C++ 1.5 Professional Edition
- Microsoft Visual C++ 2.0 Professional Edition
- Microsoft Visual C++ 4.0 Standard Edition
- Microsoft Visual C++ 4.1 Subscription
- Microsoft Visual C++ 4.2 Professional Edition
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ 5.0 Learning Edition
This article was previously published under Q113118
SYMPTOMS
The compilers listed above may misinterpret a combination of an enumerated type, a default parameter, and a constructor or function notation cast as a syntax error and may incorrectly generate one of the following:
-or-
-or-
-or-
CAUSE
The C++ compiler incorrectly parses declarations in which an enumerated type is used as a parameter to either a constructor or a function notation cast in a default parameter list. If there are other syntax errors in the declaration line in question, then it is possible that an erroneous error other than the ones listed might occur. The sample code shown below gives examples of how to generate these errors.
This problem occurs only if an explicit construction [for example, A(A::FALSE)] or function notation cast [that is, int(FALSE)] is called with an enumerated type as an argument. If the compiler is allowed to do an implicit conversion, the error will not occur:
void Func(int i = FALSE) { printf("%d\n",i); }; B(A a = A::FALSE);
RESOLUTION
In most cases (such as the examples below), the construction or function notation cast is not explicitly needed, in which case it can be removed. If this is not the case, the type cast (as opposed to function notation cast) syntax for the function should be used instead. For example, the above functions would be modified to:
void Func(int i = (int) FALSE) { printf("%d\n",i); }; B(A a = (A) A::FALSE);
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
Sample Code
TEST1.CPP
/* The following code generates error C2061 or error C2226: */ /* Compiler options needed: none */ enum tagBool {FALSE,TRUE}; class A { public: A(tagBool tc); }; void Func(A a = A(FALSE));
TEST2.CPP
/* The following code generates error C2061 or error C2062. */ /* Compiler options needed: none */ enum tagBool {FALSE,TRUE}; void Func(int i = int(FALSE)) { printf("%d\n",i); };
TEST3.CPP
/* The following code generates the C2039 error. */ /* Using Visual C++ 4.0 and later, the following code compiles */ /* correctly. Compiler options needed: none */ class A { public: enum tagBool {FALSE,TRUE}; A(tagBool tc); }; class B { public: B(A a = A(A::FALSE)); };
Additional query words: 8.00 8.00c 9.00
Keywords: kbbug kbfix kbnoupdate KB113118