boost :: apply_visitor не является членом [some] class

У меня есть ShapeType, Point с некоторыми координатами (1,2), и я хотел бы использовать apply_visitor в перегруженном операторе (), чтобы добавить координаты (3,4) к моей точке, так что точка в конечном итоге будет (4,6). Где моя реализация терпит неудачу? Я думаю, что мой класс ShapeVisitor правильный, но я получаю ошибку, «apply_visitor» не является членом CLARK :: Point.

Код выглядит следующим образом.

#include "Point_H.hpp"#include "Shape_H.hpp"#include "boost/variant.hpp"
typedef boost::variant<Point,Line,Circle> ShapeType;

ShapeType ShapeVariant(){...}

class ShapeVisitor : public boost::static_visitor<>
{
private:
double m_dx; // point x coord
double m_dy; // point y coord

public:
ShapeVisitor(double m_dx, double m_dy);
~ShapeVisitor();

// visit a point
void operator () (Point& p) const
{
p.X(p.X() + m_dx);
p.Y(p.Y() + m_dy);
}
};

int main()
{
using boost::variant;

ShapeType myShape = ShapeVariant(); // select a Point shape

Point myPoint(1,2);

boost::get<Point>(myShape) = myPoint; // assign the point to myShape

boost::apply_visitor(ShapeVisitor(3,4), myPoint); // trying to add (3,4) to myShape

cout << myPoint << endl;

return 0;
}

Спасибо!

1

Решение

  1. Вам не хватает включить (редактировать: больше не требуется)

    #include "boost/variant/static_visitor.hpp"
  2. Также вместо

    boost::get<Point>(myShape) = myPoint;
    

    Вы просто хотите сделать

    myShape = myPoint;
    

    В противном случае, если вариант на самом деле не содержит Point тем не менее, вы получите boost::bad_get исключение

  3. в заключение

    boost::apply_visitor(ShapeVisitor(3,4), myPoint);
    

    должно было

    boost::apply_visitor(ShapeVisitor(3,4), myShape);
    

Простой автономный пример, который показывает все эти точки, будет выглядеть так:
(Смотрите это в прямом эфире на http://liveworkspace.org/code/33322decb5e6aa2448ad0359c3905e9d)

#include "boost/variant.hpp"#include "boost/variant/static_visitor.hpp"
struct Point { int X,Y; };

typedef boost::variant<int,Point> ShapeType;

class ShapeVisitor : public boost::static_visitor<>
{
private:
double m_dx; // point x coord
double m_dy; // point y coord

public:
ShapeVisitor(double m_dx, double m_dy) : m_dx(m_dx), m_dy(m_dy) { }

void operator () (int& p) const { }

// visit a point
void operator () (Point& p) const
{
p.X += m_dx;
p.Y += m_dy;
}
};

int main()
{
Point myPoint{ 1,2 };

ShapeType myShape(myPoint);
boost::apply_visitor(ShapeVisitor(3,4), myShape);

myPoint = boost::get<Point>(myShape);
std::cout << myPoint.X << ", " << myPoint.Y << std::endl;
}

Выход:

4, 6
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector