Thanks. I will fix it. Romain
Le 8 févr. 2013 à 05:28, Davor Cubranic <[email protected]> a écrit : > On 13-02-07 07:24 PM, Davor Cubranic wrote: >> The version assigning an element of a const CharacterVector to a const >> std::string (named "bar" below) compiles and works fine in Rcpp 0.9.14, >> so the problem was introduced after that. > > To be more precise, it was introduced after 0.10.0 and before 0.10.1. > > Davor > >> >> On the other hand, "as<std::string>" (function "baz") fails as in >> 0.10.2, probably for the same reason Kevin identified in his last email >> (a check with ::Rf_isString). >> >> Davor >> >> >> On 13-02-07 10:55 AM, Davor Cubranic wrote: >>> I tracked this down to const-ness: >>> >>> >>> bar <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body=' >>> const CharacterVector xs(xs_); >>> const std::string x(xs(0)); >>> Rcout << x << std::endl;') >>> >>> >>> fails with the compile error mentioned in my last message, while >>> >>> foo <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body=' >>> CharacterVector xs(xs_); >>> std::string x(xs(0)); >>> Rcout << x << std::endl;') >>> >>> foo(month.abb) >>> >>> >>> works fine. I'll be happy to add a unit test to the package if the devs >>> want it. >>> >>> And to go back to my initial qustion: I'm still not sure why >>> "as<std::string>" doesn't work: >>> >>> baz <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body=' >>> CharacterVector xs(xs_); >>> std::string x = as<std::string>(xs(0)); >>> Rcout << x << std::endl;') >>> >>> baz(month.abb) >>> >>> >>> will throw "expecting a string". >>> >>> Davor >>> >>> >>> On 2013-02-07, at 10:27 AM, Davor Cubranic wrote: >>> >>>> On 2013-02-07, at 10:15 AM, Kevin Ushey wrote: >>>> >>>>> One trick to get around this is to 'as' the entire CharacterVector >>>>> into a std::vector< std::string >, and then index based off of that. >>>>> >>>>> My guess is though, elements of CharacterVectors are 'const char*' s, >>>>> so to convert them to strings you might want to just use std::string >>>>> constructor, eg. std::string( xs(0) ). >>>> >>>> That used to work with 0.10.0, but when I upgraded this morning to >>>> 0.10.2, gives me the following compile error: >>>> >>>> rcppdb.cpp:131: error: no matching function for call to >>>> 'std::basic_string<char, std::char_traits<char>, >>>> std::allocator<char> >::basic_string(SEXPREC* const&)' >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:233: note: candidates >>>> are: std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(typename >>>> _Alloc::rebind<_CharT>::other::size_type, _CharT, const _Alloc&) >>>> [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = >>>> std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:226: note: >>>> std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = >>>> char, _Traits = std::char_traits<char>, _Alloc = >>>> std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:219: note: >>>> std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(const _CharT*, typename >>>> _Alloc::rebind<_CharT>::other::size_type, const _Alloc&) [with >>>> _CharT = char, _Traits = std::char_traits<char>, _Alloc = >>>> std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:208: note: >>>> std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, >>>> _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, >>>> typename _Alloc::rebind<_CharT>::other::size_type, const _Alloc&) >>>> [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = >>>> std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:197: note: >>>> std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, >>>> _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, >>>> typename _Alloc::rebind<_CharT>::other::size_type) [with _CharT = >>>> char, _Traits = std::char_traits<char>, _Alloc = >>>> std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:183: note: >>>> std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, >>>> _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, >>>> _Alloc = std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.tcc:191: note: >>>> std::basic_string<_CharT, _Traits, >>>> _Alloc>::basic_string(const _Alloc&) [with _CharT = char, _Traits >>>> = std::char_traits<char>, _Alloc = std::allocator<char>] >>>> /usr/include/c++/4.2.1/bits/basic_string.h:2065: note: >>>> std::basic_string<_CharT, _Traits, _Alloc>::basic_string() >>>> [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = >>>> std::allocator<char>] >>>> make: *** [rcppdb.o] Error 1 >>>> >>>> Perhaps this is caused by the same bug, introduced somewhere >>>> post-0.10.0. >>>> >>>> Davor >>>> _______________________________________________ >>>> Rcpp-devel mailing list >>>> [email protected] >>>> <mailto:[email protected]> >>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >>> >>> >>> >>> _______________________________________________ >>> Rcpp-devel mailing list >>> [email protected] >>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >> >> _______________________________________________ >> Rcpp-devel mailing list >> [email protected] >> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > > _______________________________________________ > Rcpp-devel mailing list > [email protected] > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel _______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
