Article: Q155164
Product(s): Microsoft C Compiler
Version(s): 4.0,4.1,4.2
Operating System(s):
Keyword(s): kbProgramming kbCompiler
Last Modified: 29-NOV-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition, version 4.2
- Microsoft Visual C++, 32-bit Professional Edition, version 4.2
-------------------------------------------------------------------------------
SYMPTOMS
========
The wrong version of an overloaded function is called causing the following
compiler two errors:
error C2678: binary '!=' : no operator defined which takes a left-hand
operand of type 'const struct Test' (or there is no acceptable
conversion) (new behavior; please see help)
-and-
error C2664: 'Tester' : cannot convert parameter 1 from 'const struct
Test' to 'const float &' (new behavior; please see help)
The sample in the "Sample Code" demonstrates this problem. These errors occur
when:
1. The function has a global definition.
2. The function (with the same name and different argument types compared to the
global function) is defined in a named namespace.
3. The named Namespace function is included in the global namespace by the
"using" declarative.
RESOLUTION
==========
1. Put the function in a named namespace (within the global namespace) and then
use the "using" declaration. See workaround #1 below.
2. Specify the "using" declaration at the global level. See workaround #2 below.
Also see the "More Information" section for the sample code and the workarounds.
STATUS
======
Microsoft has confirmed this to be a bug in the Microsoft products listed at the
beginning of this article. This bug was corrected in Visual C++ version 5.0.
MORE INFORMATION
================
The following sample code demonstrates the problem of incorrect overloaded
function call causing the C2678 and the C2664 compiler errors.
Sample Code
-----------
/* Compile options needed: none
*/
struct Test
{
} ;
// Uncomment the following 2 lines for workaround #1
// namespace Space2
// {
int Tester(const Test& rx, const Test& ry)
{
return 0 ;
}
int operator!=(const Test& rx, const Test& ry)
{
return 0 ;
}
// Uncomment the following line for workaround #1
// }
namespace Space1
{
int operator!=(const float& rx, const Test& rt)
{
return 1 ;
}
int Tester(const float& rx, const int& ri)
{
return 1 ;
}
}
// Uncomment the following line for workaround #2
// using namespace Space1 ;
void main()
{
const Test a ;
const Test b ;
using namespace Space1 ;
if (a != b) ; // This line causes the C2678
Tester(a, b); // This line causes the C2664
}
Additional query words:
======================================================================
Keywords : kbProgramming kbCompiler
Technology : kbVCsearch kbVC400 kbAudDeveloper kbVC410 kbVC420 kbVC32bitSearch
Version : :4.0,4.1,4.2
Issue type : kbbug
Solution Type : kbfix
=============================================================================