Is this a compiler error or my code?

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 ?

+7
source share
1 answer

I was able to reproduce this (g ++ 4.7.0 and clang ++ 3.1 with lib ++ - svn), and a short debugging session showed that clang ++ installs eofbit after getline (which is normal), which somehow causes seekg install failbit . This sounds like an error, given that seekg first clears eofbit (ยง27.7.2.3 / 41)

To get around, insert is.clear() somewhere between getline and seekg .

+9
source

All Articles