Thread overview
Error: ambiguous reference to symbol
Mar 18, 2004
Alex Vinokur
Mar 18, 2004
Anton Sekeris
Mar 19, 2004
Walter
Mar 19, 2004
Alex Vinokur
Mar 19, 2004
Walter
March 18, 2004
===========================================
Digital Mars C/C++ Compiler Version 8.40.2n
===========================================


DMC has a problem with the following program.

====== C++ code : File foo.cpp : BEGIN ======

#include <string>
using namespace std;

template <class T>
int operator!=(const T& x, const T& y)
{
  return !(x == y);
}

int main ()
{
const string str;
  return 0;
}

====== C++ code : File foo.cpp : END ========

====== Compilation : BEGIN ======

$ dmc -I. -IC:/dm/stlport/stlport foo.cpp

C:/dm/stlport/stlport\stl/_algobase.c(221) : Error: ambiguous reference to symbol
Had: operator !=(const T&,const T&)
and: std::operator !=(const _Tp&,const _Tp&)
C:/dm/stlport/stlport\stl/_algobase.c(234) : Error: ambiguous reference to symbol
Had: operator !=(const T&,const T&)
and: std::operator !=(const _Tp&,const _Tp&)
C:/dm/stlport/stlport\stl/_algobase.c(235) : Error: ambiguous reference to symbol
Had: operator !=(const T&,const T&)
and: std::operator !=(const _Tp&,const _Tp&)
C:/dm/stlport/stlport\stl/_algobase.c(240) : Error: ambiguous reference to symbol
Had: operator !=(const T&,const T&)
and: std::operator !=(const _Tp&,const _Tp&)
C:/dm/stlport/stlport\stl/_string.c(392) : Error: ambiguous reference to symbol
Fatal error: too many errors
--- errorlevel 1

====== Compilation : END ========


--
   Alex Vinokur
     mailto:alexvn@connect.to
     http://mathforum.org/library/view/10978.html



March 18, 2004
Walter,

Alex' problem might be stemming from the same issue as the one I reported in C++.beta under subject 'namespace bug?' on 2004/02/18.

Kind regards,
Anton Sekeris.


Alex Vinokur wrote:

> 
> ===========================================
> Digital Mars C/C++ Compiler Version 8.40.2n
> ===========================================
> 
> 
> DMC has a problem with the following program.
> 
> ====== C++ code : File foo.cpp : BEGIN ======
> 
> #include <string>
> using namespace std;
> 
> template <class T>
> int operator!=(const T& x, const T& y)
> {
>   return !(x == y);
> }
> 
> int main ()
> {
> const string str;
>   return 0;
> }
> 
> ====== C++ code : File foo.cpp : END ========
> 
> ====== Compilation : BEGIN ======
> 
> $ dmc -I. -IC:/dm/stlport/stlport foo.cpp
> 
> C:/dm/stlport/stlport\stl/_algobase.c(221) : Error: ambiguous
> reference to symbol Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_algobase.c(234) : Error: ambiguous
> reference to symbol Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_algobase.c(235) : Error: ambiguous
> reference to symbol Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_algobase.c(240) : Error: ambiguous
> reference to symbol Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_string.c(392) : Error: ambiguous reference
> to symbol Fatal error: too many errors
> --- errorlevel 1
> 
> ====== Compilation : END ========
> 
> 
> --
>    Alex Vinokur
>      mailto:alexvn@connect.to
>      http://mathforum.org/library/view/10978.html

March 19, 2004
The problem is there's a template in std which matches the template you defined in the global namespace. By bringing std's symbol table into the global namespace, then there's a conflict. This is not a bug in DMC++.

"Alex Vinokur" <alexvn@connect.to> wrote in message news:c3c9cn$aov$1@digitaldaemon.com...
>
> ===========================================
> Digital Mars C/C++ Compiler Version 8.40.2n
> ===========================================
>
>
> DMC has a problem with the following program.
>
> ====== C++ code : File foo.cpp : BEGIN ======
>
> #include <string>
> using namespace std;
>
> template <class T>
> int operator!=(const T& x, const T& y)
> {
>   return !(x == y);
> }
>
> int main ()
> {
> const string str;
>   return 0;
> }
>
> ====== C++ code : File foo.cpp : END ========
>
> ====== Compilation : BEGIN ======
>
> $ dmc -I. -IC:/dm/stlport/stlport foo.cpp
>
> C:/dm/stlport/stlport\stl/_algobase.c(221) : Error: ambiguous reference to
symbol
> Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_algobase.c(234) : Error: ambiguous reference to
symbol
> Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_algobase.c(235) : Error: ambiguous reference to
symbol
> Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_algobase.c(240) : Error: ambiguous reference to
symbol
> Had: operator !=(const T&,const T&)
> and: std::operator !=(const _Tp&,const _Tp&)
> C:/dm/stlport/stlport\stl/_string.c(392) : Error: ambiguous reference to
symbol
> Fatal error: too many errors
> --- errorlevel 1
>
> ====== Compilation : END ========
>
>
> --
>    Alex Vinokur
>      mailto:alexvn@connect.to
>      http://mathforum.org/library/view/10978.html
>
>
>


March 19, 2004
"Walter" <walter@digitalmars.com> wrote in message news:c3du2o$4tn$2@digitaldaemon.com...
> The problem is there's a template in std which matches the template you defined in the global namespace. By bringing std's symbol table into the global namespace, then there's a conflict. This is not a bug in DMC++.
>
[snip]

So, what to do?
P.S. GNU g++ 3.3.1, Microsoft C++ 13.00.9466, Borland C++ 5.5.1 have no problem with that code.

--
   Alex Vinokur
     mailto:alexvn@connect.to
     http://mathforum.org/library/view/10978.html



March 19, 2004
"Alex Vinokur" <alexvn@connect.to> wrote in message news:c3e0io$a15$1@digitaldaemon.com...
>
> "Walter" <walter@digitalmars.com> wrote in message
news:c3du2o$4tn$2@digitaldaemon.com...
> > The problem is there's a template in std which matches the template you defined in the global namespace. By bringing std's symbol table into the global namespace, then there's a conflict. This is not a bug in DMC++.
> >
> [snip]
>
> So, what to do?

Decide which version of the template you wish to use, and either delete the other one or turn off importing the namespace.

> P.S. GNU g++ 3.3.1, Microsoft C++ 13.00.9466, Borland C++ 5.5.1 have no
problem with that code.

It's not the first time DMC++ is the only compiler that gets it right!