Swig: синтаксическая ошибка при переносе глобальных статических констант - PullRequest
0 голосов
/ 30 мая 2019

Когда я пытаюсь обернуть следующий код:

enum VehicleSide {
    LEFT = 0,  ///< left side of vehicle is always 0
    RIGHT = 1  ///< right side of vehicle is always 1
};

/// Class to encode the ID of a vehicle wheel.
/// By convention, wheels are counted front to rear and left to right. In other
/// words, for a vehicle with 2 axles, the order is: front-left, front-right,
/// rear-left, rear-right.
class WheelID {
  public:
    WheelID(int id) : m_id(id), m_axle(id / 2), m_side(VehicleSide(id % 2)) {}
    WheelID(int axle, VehicleSide side) : m_id(2 * axle + side), m_axle(axle), m_side(side) {}

    /// Return the wheel ID.
    int id() const { return m_id; }

    /// Return the axle index for this wheel ID.
    /// Axles are counted from the front of the vehicle.
    int axle() const { return m_axle; }

    /// Return the side for this wheel ID.
    /// By convention, left is 0 and right is 1.
    VehicleSide side() const { return m_side; }

  private:
    int m_id;            ///< wheel ID
    int m_axle;          ///< axle index (counted from the front)
    VehicleSide m_side;  ///< vehicle side (LEFT: 0, RIGHT: 1)
};

/// Global constant wheel IDs for the common topology of a 2-axle vehicle.
static const WheelID FRONT_LEFT(0, LEFT);
static const WheelID FRONT_RIGHT(0, RIGHT);
static const WheelID REAR_LEFT(1, LEFT);
static const WheelID REAR_RIGHT(1, RIGHT);

я получаю «синтаксическую ошибку на входе» при static const WheelID FRONT_LEFT (0, LEFT); .В файле интерфейса я просто использую% include в соответствующем заголовке.Я понятия не имею, что является причиной ошибки, поэтому любая помощь приветствуется, но я бы предпочел не редактировать заголовок.Спасибо

РЕДАКТИРОВАТЬ: удаление ключевого слова static не поможет

1 Ответ

0 голосов
/ 31 мая 2019

Показ вашего SWIG-файла .i может помочь, но причина, скорее всего, в том, что вы поместили экземпляры вашего класса в заголовочный файл. Я вижу, что вы не хотите редактировать заголовок, но файл .h должен extern экземпляры классов, а определение должно быть в файле .cpp; в противном случае у вас будет несколько отдельных экземпляров ваших глобальных переменных, если файл включен в два разных файла .cpp. Кроме того, SWIG не понимает это как есть, поэтому у вас действительно нет выбора ...

Рабочий пример:

test.h

enum VehicleSide {
    LEFT = 0,  ///< left side of vehicle is always 0
    RIGHT = 1  ///< right side of vehicle is always 1
};

/// Class to encode the ID of a vehicle wheel.
/// By convention, wheels are counted front to rear and left to right. In other
/// words, for a vehicle with 2 axles, the order is: front-left, front-right,
/// rear-left, rear-right.
class WheelID {
  public:
    WheelID(int id) : m_id(id), m_axle(id / 2), m_side(VehicleSide(id % 2)) {}
    WheelID(int axle, VehicleSide side) : m_id(2 * axle + side), m_axle(axle), m_side(side) {}

    /// Return the wheel ID.
    int id() const { return m_id; }

    /// Return the axle index for this wheel ID.
    /// Axles are counted from the front of the vehicle.
    int axle() const { return m_axle; }

    /// Return the side for this wheel ID.
    /// By convention, left is 0 and right is 1.
    VehicleSide side() const { return m_side; }

  private:
    int m_id;            ///< wheel ID
    int m_axle;          ///< axle index (counted from the front)
    VehicleSide m_side;  ///< vehicle side (LEFT: 0, RIGHT: 1)
};

// Instances of these global variables must be outside the header.
// What if the header was included in two files?
extern const WheelID FRONT_LEFT;
extern const WheelID FRONT_RIGHT;
extern const WheelID REAR_LEFT;
extern const WheelID REAR_RIGHT;

test.i

%module test

%{ // Section included verbatim in the generated wrapper source.

#include "test.h"

// One-time instances of the class.  In this case, directly
// added to the wrapper, but it could be in a separate .cpp file
// or .lib and linked to the final extension.
const WheelID FRONT_LEFT(0, LEFT);
const WheelID FRONT_RIGHT(0, RIGHT);
const WheelID REAR_LEFT(1, LEFT);
const WheelID REAR_RIGHT(1, RIGHT);

%}

// Generate wrappers for test.h contents
%include "test.h"

Демо-версия:

>>> import test
>>> test.REAR_RIGHT.id()
3
...