Re: Why koenig lookup?
Alf P. Steinbach wrote:
* kwikius:
kwikius wrote:
Jerry Coffin wrote:
In article <2a0f00c3-10cd-4b64-8203-57c5e681b565
@k13g2000hse.googlegroups.com>, james.kanze@gmail.com says...
[ ... ]
But doesn't use sin in a dependent context in a dependent
context in the template. I was thinking of the classical case,
where the operator<< for std::vector<int> defined in global
namespace doesn't get found when it is used in
std::ostream_iterator. Curiously, I can't reproduce the
symptomes in a simple example, but I've definitely had the
problem myself, and people post it here from time to time.
Here's a fairly simple example:
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
typedef std::map<std::string, int> s_int;
//namespace std {
std::ostream &operator<<(std::ostream &os, s_int::value_type const &v)
{ return os << v.first << ": " << v.second;
}
//}
int main() { s_int m;
m["a"] = 123;
m["b"] = 345;
std::copy(m.begin(), m.end(),
std::ostream_iterator<s_int::value_type>(std::cout, "\n"));
return 0;
}
As it stands right now, it won't compile -- but remove the two
comment delimiters so operator<< is in namespace std, and it
compiles and works just fine.
Lemme guess. operator<<(std::ostream&, int ) is ***NOT*** in global
namespace Right? .. Which is the whole point!
I'm with Alf Steinbach on this one....
Oh I see..
hmm C++ is too complicated. Bring back BASIC I say :-(
Well, the rule's simple: if you place an overload in the original
namespace, it will most likely be considered by original code there,
otherwise it may not.
It's like this:
#include <math.h>
namespace james
{
struct BigInt {};
double sin( BigInt ) { return 0; }
void foo() { sin( 3.14 ); } // *\/o
}
int main()
{
james::foo();
}
Here the sinful overload of sin placed in namespace james causes
compilation failure of foo. So I guess you're still with me on this...
Yes? <g>
Cheers,
- Alf
Well IIRC if you use VC8 then <cmath> includes <math.h> and then
using ::sin; etc
which is another situation again.
Anyway rather than discussing what does happen and why, which AFAICS is
extremely complicated (I can't find a way to get Jerry Coffins example
to find the function in global to create an ambiguity, which AFAICS
means global namespace is not considered in that case... whatever that
case actually is), I'm more interested in figuring out not even how to
fix it in C++, but if there is a simple solution to connecting a set of
UDT's to their correct expression generically(in my fictional
programming language 'Bob')
...and meanwhile in the real world I've had to bite the bullet and start
getting to grips with Latex... no not that sort. the Knuth, Tex latex..
http://miktex.org/
.... cool !
but I'm with you in spirit...
regards
Andy Little