Hi all,

I'm not sure whether this is a bug or not, so I think this is the
right place to start with. Consider the following code:

Rcpp::sourceCpp(code='
  #include <Rcpp.h>
  using namespace Rcpp;

  // [[Rcpp::export]]
  void print_fun(Function x) {
    Rcout << x << std::endl;
  }

  // [[Rcpp::export]]
  void print_env(Environment x) {
    Rcout << x << std::endl;
  }
')

print_fun(function() {})
print_env(environment())

It compiles and the output from the functions are two addresses. So
far, so good. However, if we try the same for a data frame, the
compilation fails, so we need to define the operator<< as follows:

Rcpp::sourceCpp(code='
  #include <Rcpp.h>
  using namespace Rcpp;

  inline std::ostream& operator<<(std::ostream& out, const DataFrame& df) {
    out << "data.frame";
    return out;
  }

  // [[Rcpp::export]]
  void print_df(DataFrame x) {
    Rcout << x << std::endl;
  }
')

print_df(data.frame(x=1))

Now, it compiles and produces the output we defined. Once more, so
far, so good. Now the problem comes when we try to merge the two
examples above, that is:

Rcpp::sourceCpp(code='
  #include <Rcpp.h>
  using namespace Rcpp;

  inline std::ostream& operator<<(std::ostream& out, const DataFrame& df) {
    out << "data.frame";
    return out;
  }

  // [[Rcpp::export]]
  void print_df(DataFrame x) {
    Rcout << x << std::endl;
  }

  // [[Rcpp::export]]
  void print_fun(Function x) {
    Rcout << x << std::endl;
  }

  // [[Rcpp::export]]
  void print_env(Environment x) {
    Rcout << x << std::endl;
  }
')

The compilation fails again due to an ambiguous overload for Function
and Environment types, so that we need to define the operator<< for
these classes too in order to disambiguate and fix this. I suppose it
may happen for other classes too. Is this... expected? Desirable? At
the very least, it is confusing from my point of view.

Regards,
Iñaki
_______________________________________________
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