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.

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

Reply via email to