Re: VC8 Compiler bizarreness
"Murrgon" wrote:
I thought the VC8 in the subject might have given that away, but
just to be sure it's VisualStudio 2005 (VisualC++ version 8).
We're using the Professional build.
I made shorter example that exhbits the problem:
<code>
#include <vector>
template<typename T>
class X
{
friend bool operator !=(T*, const X<T>&)
{ return true; }
};
typedef X<double> XD;
typedef std::vector<XD> XDVec;
int main()
{
XDVec vec;
XD d;
bool b1 = (NULL != vec[0]);
bool b2 = (NULL != d);
}
</code>
Here are compilation results:
VC++ 2008 (v9.0) - compiles without any problem.
VC++ 2005 (v8.0) - fails to compile as long as global operator is
inline.
Comeau C++ Online - same as VC++ 2008.
So, I think it is indeed a bug in VC++2005. Strangely enough it
happens only with `XDVec' vector instance and not when `XD'
instance is used directly. In order to resolve it you need to do
the folowing:
1. Make global `operator !=' defined outside of class X:
template<typename T>
class X
{
friend bool operator !=(T*, const X<T>&);
};
template<typename T>
bool operator !=(T*, const X<T>&)
{ return true; }
2. Replace `T*' input parameter type with `int', since VC++2005
fails to deduce parameter type from NULL. I just added another
`operator !=':
template<typename T>
class X
{
friend bool operator !=(int, const X<T>&);
...
};
template<typename T>
bool operator !=(int, const X<T>&)
{ return true; }
With the changes above the code compiles with VC++2005. I think
you could open a bug report with MS and demand a hotfix.
HTH
Alex