jeudi 3 mars 2016

Compilation issue with sitmo prng, c++11, and armadillo

I'm trying to compile the sitmo prng under C++11 within an R package. The problematic code has been packaged and is available here. The objective of this R package is to make available the sitmo header file so that other packages are able to use the LinkTo field within description. As an added bonus, the package is scheduled to ship with an Armadillo + OpenMP example. There is one other package, mvnfast, that uses sitmo, but only under c++98 and boost headers.

I believe that the error which I am receiving is specific to OS X and clang. I haven't been able to replicate it on Windows via win-build. With that being said, the error is:

/Applications/http://ift.tt/1ppICFP: error: non-type template argument is not a constant expression
        const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value;

The error has only popped up on the Rcpp dev list. The resolution in this case was to compile under C++98 and use boost.

The above error is followed by the following notes:

^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/http://ift.tt/1ppIFSb: note: in instantiation of function template specialization 'std::__1::generate_canonical<double, 53, sitmo::prng_engine>' requested here
        * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g)
                 ^
/Applications/http://ift.tt/1Qw4YMz: note: in instantiation of function template specialization 'std::__1::uniform_real_distribution<double>::operator()<sitmo::prng_engine>' requested here
        {return (*this)(__g, __p_);}
                ^
sitmo_test.cpp:77:26: note: in instantiation of function template specialization 'std::__1::uniform_real_distribution<double>::operator()<sitmo::prng_engine>' requested here
      double u = distunif(engine);
                         ^
/Applications/http://ift.tt/1ppICFP: note: non-constexpr function 'max' cannot be used in a constant expression
    const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value;
                                           ^
../inst/include/prng_engine.hpp:100:23: note: declared here
  static result_type (max)() { return 0xFFFFFFFF; }

The version of clang being used is:

Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix

Aucun commentaire:

Enregistrer un commentaire