Here is another riddle that I’ve been trying to solve for some time now, without any success. Maybe someone on the forum can help me with it.
I’m running a quite well developed analysis code on PROOF (PROOF-lite mainly). When I start running a query, I always get this error message:
The message is in such a format because I install my own ErrorHandler function using SetErrorHandler…
I tried looking everywhere in my code for an std::setstd::string object, but with no luck. I don’t think I use such an object anywhere in my code.
I even tried compiling a dictionary with CINT for such an object, but that didn’t change anything. (Besides, CINT complained that such a dictionary should already be built-in.)
Apart from being annoying, the message doesn’t seem to do anything harmful. My analysis jobs seem to work well, I get the expected results, so I can’t make much of the message… But because it is annoying, and I really don’t want to filter it out in my ErrorHandler function (which would be quite a brute-force method even for me…), if anyone can give me an idea how to track down the source of this message, I would be very grateful.
This message indicates that you are (possibly indirectly) trying to save object which has a member of type set<string,less,allocator >::iterator and your do not have an I/O dictionary for this iterator.
However I do not see almost no reason to store an iterator in a ROOT file (and if you do, you would almost certainly need a custom streamer).
So the real solution is to make the iterator member transient.
Now the real problem is that you do not know (yet) which class this member belongs to
You could try to run you example with gDebug set to 4 or so other higher value. Another simple way is to use gdb (or your favorite debugger) to get a stack trace at the point where the message is printed. The value of the argument of one (or more) of the function on the stack should tell you to which class the member belongs.
I finally had a little time to hunt down this error message. I believe that it’s coming from the fIter member of TStatus…
When I set gDebug to 4, I see the error message squeezed between the messages about loading libsetDict.so and friends, and the StreamerInfo messages for the TStatus class.
Looking at TStatus.h, I see however that the fIter member is declared transient. Does rootcint care if there is no space after “//!” ? In any case, I see in the header files that it’s semi-random whether there is a space or not.
So while I think I’ve found the problem, I have no idea why it happens.
I can reproduce this problem and I am investigating.
This problem has been fixed in the head of the SVN trunk.