Here is a sample code:
#include <iostream> #include <stdexcept> #include <cstring> #include <ctime> #include <sstream> using std::cout; using std::endl; std::size_t const BUF_SIZE(1000); std::ostream& operator<<(std::ostream& os, std::tm const& rhs) { os << asctime(&rhs); return os; } std::istream& operator>>(std::istream& is, std::tm& rhs) { while (is.peek() == ' ' || is.peek() == '\t') { is.get(); } std::streampos curPos = is.tellg(); char buf[BUF_SIZE]; is.getline(buf, BUF_SIZE); char* ptr = strptime(buf, "%D %T", &rhs); if (ptr == 0) { throw std::runtime_error("strptime() failed!"); } std::size_t processed = ptr - buf; is.seekg(curPos + static_cast<std::streampos>(processed)); return is; } int main() { std::istringstream is("10101 07/09/12 07:30:00 123.24"); int uuid(0); double price(0); std::tm ptime; std::memset(&ptime, 0, sizeof(tm)); is >> uuid >> ptime >> price; cout << "UUID: " << uuid << endl; cout << "Time: " << ptime; cout << "Price: " << price << endl; }
where I try to overload the <<and โ operators for the tm structure! If I compile my code with g ++ and run it, I get:
UUID: 10101 Time: Sun Jul 9 07:30:00 2012 Price: 123.24
Perfect!
But, if I compile it with clang ++, I get:
UUID: 10101 Time: Sun Jul 9 07:30:00 2012 Price: 0
OOPS!
What's happening? is it a clang problem or is it a way to handle istream ?
Reza Toghraee
source share