/ / Swig otrzymał błędy „nieznanej przestrzeni nazw” w aliasingu przestrzeni nazw - c ++, przestrzeni nazw, swig

Swig podając "nieznany obszar nazw" błędy w aliasach przestrzeni nazw - c ++, przestrzenie nazw, swig

Mam plik nagłówkowy jak

#include <MyUtils.h> // defines namespace MyUtils, and MyUtils::Math

namespace mum=MyUtils::Math;

class LocalClass{

public:
void eat( const mum::array& arr);
};

Mam to co zwykle %{ #include %}, %include struktura w moim .i plik.

Kiedy uruchamiam swig, otrzymuję:

Error: Unknown namespace "MyUtils::Math"

Jak / dlaczego SWIG nie wie o aliasingu przestrzeni nazw? Czy istnieje coś innego niż używanie #ifndef SWIG makra preprocesora? (por. ta dyskusja (Muszę zachować mój kod c ++ niezależny od swig)

Wersja SWIG 2.0.4

Odpowiedzi:

2 dla odpowiedzi № 1

Załóżmy, że mamy nagłówek

// MyUtils.h
namespace MyUtils {
namespace Math {
typedef int SomeType;
class array {
//
};
}
}

I kolejny nagłówek

// MyHeader.h
#include <MyUtils.h>
namespace mum=MyUtils::Math;

class LocalClass {

public:
void eat( const mum::array& arr);
};

Jeśli plik SWIG wygląda

// MySwigInterfaceFile.i
%module MySwigModule
#include "MyHeader.h

%include "MyHeader.h"

Wpadniesz w kłopoty, SWIG wygeneruje kod, którego nie można skompilować z wielu powodów

1) Musisz dołączyć wszystkie nagłówki, SWIG nie możerekurencyjny nagłówek, tj. musisz dołączyć MyUtils.h do MySwigInterfaceFile.i przed MyHeader.h, to samo dotyczy włączenia za pomocą dyrektywy% include

2) Musisz pisać używając przestrzeni nazw MyUtils :: Math; po włączeniach za pomocą #include

3) Aby SWIG był świadomy wszelkich typów czcionek w zagnieżdżonych przestrzeniach nazw, musisz napisać

namespace MyUtils {
namespace Math {
%typedef int SomeType;
}
}

przed inkluzjami używającymi% obejmują

Polecam programistom zacząć od wielu małych projektów, aby zdobyć praktyczne doświadczenie z SWIG.


0 dla odpowiedzi nr 2

SWIG wydaje się obsługiwać aliasing przestrzeni nazw. Myślę, że problem jest prawdopodobnie w MyUtils.h; być może istnieją definicje preprocesora, które należy ustawić, aby używał przestrzeni nazw. Możesz je zdefiniować w wierszu poleceń SWIG.