Boost logo

Boost Users :

From: Bo Peng (ben.bob_at_[hidden])
Date: 2004-11-19 14:30:02


Dear list,

I have a problem with apply_visitor of boost::variant. It seems to me
that it can not accept a temporary variant variable that is returned
from a function. Is this a bug?

Here is a simple example:

===================================
#include "boost/variant.hpp"
using namespace std;

#include <string>
typedef boost::variant<double, string > Variable;

#include <iostream>

// a simple visitor that returns a variant.
class variantPlusOne
: public boost::static_visitor<Variable>
{
  public:
    Variable operator()( double i) const
    {
      return Variable( i + 1 );
    }

    Variable operator()( string str) const
    {
      return Variable( 0);
    }
};

// apply_visitor in function form
Variable func(Variable a)
{
  return boost::apply_visitor( variantPlusOne(), a);
}

// a silly function.
Variable me(Variable a)
{
  return a;
}

int
main()
{
  Variable b("5");
  cout << func(b) << endl; // OK
  cout << func(me(b)) << endl; // OK
  cout << boost::apply_visitor(variantPlusOne(), b ) << endl; // OK
  // cout << boost::apply_visitor(variantPlusOne(), me(b) ) << endl; // NO
  return 0;
}

/////////////////////////////
The error messages are:

test.cpp:44: no matching function for call to `apply_visitor(variantPlusOne,
   Variable)'
boost_1_31_0/boost/variant/detail/apply_visitor_unary.hpp:59: candidates are:
   Visitor::result_type boost::apply_visitor(Visitor&, Visitable&) [with
   Visitor = variantPlusOne, Visitable = Variable]
boost_1_31_0/boost/variant/detail/apply_visitor_unary.hpp:75:
   Visitor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with
   Visitor = variantPlusOne, Visitable = Variable]

///////////////////////////////
Note that I can understand this behavior if the visitor takes
reference arguments (and therefore expects a persistent variable) but
my visitor pass argument by values.

Thanks.
Bo


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net