我有一个像这样的头文件
#include <MyUtils.h> // defines namespace MyUtils, and MyUtils::Math
namespace mum=MyUtils::Math;
class LocalClass{
public:
void eat( const mum::array& arr);
};
我的 .i
文件中有通常的 %{ #include %}, %include
结构。
当我运行 swig 时,我得到:
Error: Unknown namespace 'MyUtils::Math'
SWIG 如何/为什么不知道 namespace 别名?
除了使用 #ifndef SWIG
预处理器宏之外,还有其他解决方法吗? (c.f. this discussion(我需要让我的 C++ 代码独立于 swig)
痛饮版本 2.0.4
最佳答案
假设有一个标题
// 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) 您需要包含所有 header ,SWIG 无法递归 header ,即您必须在 MySwigInterfaceFile.i 中的 MyHeader.h 之前包含 MyUtils.h,这同样适用于使用 %include 指令的包含
2) 必须使用 using namespace MyUtils::Math;使用#include
跟随包含3) 要让 SWIG 知道嵌套命名空间内的任何 typedef,您必须编写
namespace MyUtils {
namespace Math {
%typedef int SomeType;
}
}
在使用 %include 包含之前
我建议程序员从许多小项目开始,以获得 SWIG 的实践经验。
关于c++ - Swig 在命名空间别名上给出 "unknown namespace"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24126975/