Microsoft KB Archive/116487

= BUG: No Compiler Error for Ambiguous C++ Conversion =

Article ID: 116487

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 1.0 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 Standard Edition
 * Microsoft Visual C++ 6.0 Service Pack 5
 * Microsoft Visual C++ .NET 2002 Standard Edition
 * Microsoft Visual C++ .NET 2003 Standard Edition

-



This article was previously published under Q116487



SYMPTOMS
Class A has a member function that converts an instance of class B to an instance of class A. Class B also has a member function that converts an instance of class B to an instance of class A. Therefore, when you assign an instance of class B to an instance of class A, the compiler could use both conversion methods, resulting in an ambiguity. However, the C/C++ compiler does not generate an error message in this situation, as demonstrated by the sample code in the "MORE INFORMATION" section, below.



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



MORE INFORMATION
You can use the following sample code to reproduce this problem:

Sample Code
/* Compile options needed: none


 * 1) include 

class B;

class A { public: // This is the function the compiler // chooses to call. A(B&) { cout << "called A::A(B&)" << endl; } };

class B { public: operator A // This function does not get called. {         B b;          cout << "called operator B::A" << endl; return b;    } };

void main {       B b;        A a = b; // A(b) or b.operator A? // The compiler should issue an                // error here but instead chooses // to call A::A(B&).

cout << "failed: should not compile- see ARM 12.3.2" << endl; }

