Boost logo

Boost :

Subject: [boost] [TR1] Sun problems (again)
From: Ling Li (liling_at_[hidden])
Date: 2008-11-12 16:42:35


(The related thread is
http://lists.boost.org/Archives/boost/2006/08/109450.php)

Sun CC seems to have #include guards automatically for standard headers like
<memory>. This somehow causes problems to Boost::TR1. Here is a simple
example (call it sun-test.cpp) that doesn't compile with Sun's compiler:

#include <string>
#include <memory>

void f() {
    std::tr1::shared_ptr<int> p(new int());
}

The command line is: CC -c -library=stlport4 -I<BOOST_TOP>/boost/tr1/tr1/sun
-I<BOOST_TOP>/boost/tr1/tr1 -I<BOOST_TOP> sun-test.cpp

And the error msgs:
"sun-test.cpp", line 5: Error: tr1 is not a member of std.
"sun-test.cpp", line 5: Error: shared_ptr is not defined.
"sun-test.cpp", line 5: Error: Badly formed expression.

The reason is that the 2nd include, "#include <memory>," is not honored
since Sun's <string> (included from Boost::TR1's string) somehow loads
<memory> inside it. Although the <memory> header it loads is the Boost::TR1
version, Boost is smart enough not to include the TR1 extension part. That
is actually the correct thing to do, and other compilers (VS and GCC) will
get the TR1 extension via the 2nd include. But for Sun's CC, since the 2nd
include is not honored, std::tr1 is missing.

Sun CC doesn't do that auto #include guards for user headers.

I am wondering if there is a way to turn off that auto guards for Sun CC (I
haven't found a way yet). Or is there some way to change Boost::TR1 to
accommodate this special behavior?


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk