Swig在命名空间别名上给出“未知命名空间”错误

时间:2014-06-09 18:54:49

标签: c++ namespaces swig

我有一个像

这样的头文件
#include <MyUtils.h> // defines namespace MyUtils, and MyUtils::Math

namespace mum=MyUtils::Math;

class LocalClass{

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

我的%{ #include %}, %include文件中有通常的.i结构。

当我跑步时,我得到:

Error: Unknown namespace 'MyUtils::Math'

SWIG如何/为何不了解命名空间别名? 除了使用#ifndef SWIG预处理器宏之外还有其他工作吗? (c.f。this discussion(我需要让我的c ++代码独立于swig)

SWIG版本2.0.4

2 个答案:

答案 0 :(得分:2)

假设有一个标题

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

另一个标题

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

class LocalClass {

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

如果SWIG文件看起来像

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

%include "MyHeader.h"

你遇到麻烦,SWIG会生成无法编译的代码

1)你需要包含所有标题,SWIG不能递归标题,即你必须在MyHeader.h之前的MySwigInterfaceFile.i中包含MyUtils.h,同样适用于使用%include指令的包含

2)你必须使用命名空间MyUtils :: Math;使用#include

跟踪包含

3)要使SWIG知道嵌套命名空间内的任何typedef,必须编写

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

使用%include之前的包含

我建议程序员从许多小项目开始,以获得SWIG的实际操作经验。

答案 1 :(得分:0)

SWIG确实支持命名空间别名。我认为这个问题很可能发生在MyUtils.h;也许有预处理器定义,你必须设置它们才能使用名称空间。您可以在SWIG命令行上定义它们。