C
Chris Johnson
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:air<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:stream& operator<<(std:stream& 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:stream& operator<<(std:stream& 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:stream_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
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:air<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:stream& operator<<(std:stream& 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:stream& operator<<(std:stream& 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:stream_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