|
From: Peter C. <pca...@gm...> - 2013-05-30 16:13:28
|
following up the topic below: I missed to look at the test-suite, where some more auto_ptr would have to be replaced by unique_ptr. https://github.com/pcaspers/quantlib/commit/466fbfbc423312eb7c4536ab59d861689cde70a0 Furthermore the header ql/utilities/clone.hpp has to be changed. https://github.com/pcaspers/quantlib/commit/fe5a87dcfb60c10f1d8600b1511037e200915e4c https://github.com/pcaspers/quantlib/commit/7a12fc4c62b44d175dc794b487db0582803ef6a5 The test-suite now compiles and runs using g++ (with and without -std=c++0x) which is the main thing I guess. The whole thing does not look very nice though. Also I am not c++ expert enough to say that the upgrade of clone.hpp to unique_ptr should be done like this. Luigi ? Thank you Peter Peter Caspers <pca...@gm...> writes: > Hi Luigi, all, > > we discussed compiling the core lib under the c++11 standard (e.g. with > g++ -std=c++0x). This produces some errors which can be fixed easily > (keeping backward compatibility): > > https://github.com/pcaspers/quantlib/commit/5b32b7705530264551e0622d0a2673813067be5b > > What is left is a bunch of warnings saying that std::auto_ptr is > depricated under c++11, the replacement being std::unique_ptr. A > possible solution is to replace the auto_ptr in the source by unique_ptr > (thus upgrading the code to c++11 already) and replace the unique_ptr by > auto_ptr again in case that compilation is done under c++ versions < > 11. I have done this here > > https://github.com/pcaspers/quantlib/commit/3e47a82a936112f12e3bb502292833d860f5aac9 > > with a #define in qldefines.hpp resetting the pointers to auto_ptr again > based on the boost macro BOOST_NO_CXX_SMART_PTR. Unfortunately this > macro is available only in later boost versions so if one uses an older > one and provides no c++11 support he or she will get errors. Therefore > the following solution might be better > > https://github.com/pcaspers/quantlib/commit/6db965375b02094a7ea0da4e48efd7e0a1b8fd85 > > using the __cplusplus macro to identify c++11. However since gcc sets > this macro simply to 1 in versions 4.6 (should be solved starting in > 4.7), I had to add another criterion for gcc based on > __GXX_EXPERIMENTAL_CXX0X_. > > For msvc 2010 the __cplusplus is also not 201103L but still 199711L. This > seems also to be the case in 2012 and this specific case was reported as a bug to > Microsoft, > > http://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l > > though not solved yet. Therefore I added a direct test on msvc 2010 or > higher versions based on _MSC_VER > > https://github.com/pcaspers/quantlib/commit/796beb89e2a707f951b77869bf869694e67ac769 > > This final solution should work for all versions of msvc and gcc. I can not check other > compilers however. > > Since the #define seems a bit like a dirty hack we also thought of a > typedef. But then we would need a template typedef which is available only in > c++11 again and a metaprogramming-like workaround a la > > template<class T> struct PTR { > typedef std::unique_ptr<T> Type; > }; > > PTR<double>::Type a(new double(0.0)); > > does not seem to improve the code either. > > Do you think we should do the upgrade to c++11 like propsed above or is there > maybe a better solution (I bet there is...). Or should we defer the > upgrade until a later release ? I personally would very much like to be > able to compile under c++11 without warnings already now. > > Thank you > Peter > > > > |