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
Rcpp-devel@lists.r-forge.r-project.org
<mailto:Rcpp-devel@lists.r-forge.r-project.org>
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel



_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to