How to resolve ADL(?) issue using std::copy and std::ostream_iterator
My knowledgeable friends over at comp.lang.c++ directed me to post this
message here. I am pasting the message here as originally asked.
Apologies if this comes off as spamming/cross-posting to either group
(not the intent):
Greetings all. I am really stuck on this one as I can't seem to grok if
I am abusing the C++ language or if I am simply using components of the
C++ Standard Library incorrectly. Here is the code:
#include <string>
#include <map>
#include <iostream>
#include <utility>
#include <iterator>
typedef std::pair<std::string, std::string> STR;
#ifdef NON_COMPLIANT
// Works but my understanding this is forbidden by
// Standard ISO/IEC 14882.2003 17.4.3.1-1
// since I introduce code into namespace std
namespace std {
{
std::ostream& operator<<(std::ostream& os, STR const& ip) {
os << ip.first << " " << ip.second << std::endl;
return os;
}
}
#else
// Generates error
// std::copy can't find a suitable candidate for operator<<
std::ostream& operator<<(std::ostream& os, STR const& ip) {
os << ip.first << " " << ip.second << std::endl;
return os;
}
#endif
int main(int argc, char** argv, char** env) {
std::map<std::string, std::string> test;
test["foo"] = "bar";
test["baz"] = "qux";
std::ostream_iterator<STR> o(std::cout);
std::copy(
test.begin(),
test.end(),
o);
return 0;
}
If compiled with the macro definition NON_COMPLIANT line 12 violates the
Standard section 17.4.3.1-1 commented on in the code but that seems to
be the only way to allow for std::copy to deduce the correct context of
operator<<, is this correct? (I apologize if I am not using the correct
terminology - please educate me accordingly on this as well)
If my understanding above is correct then can I conclude that I simply
do not understand how to use the Standard C++ library correctly in this
case? The code appears to be a logical use of the components at play
but my compiler disagrees with my thinking.
Thank you for reading and any insight you can assist me with in advance.
Chris
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]