Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Swig-given";未知名称空间";命名空间别名错误_C++_Namespaces_Swig - Fatal编程技术网

C++ Swig-given";未知名称空间";命名空间别名错误

C++ Swig-given";未知名称空间";命名空间别名错误,c++,namespaces,swig,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); }; SWIG如何/为什么不知道名称空间别名? 除了使用#ifndef SWIG预处理器宏,还有其他解决方法

我有一个头文件,比如

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

namespace mum=MyUtils::Math;

class LocalClass{

    public:
         void eat( const mum::array& arr);
};
SWIG如何/为什么不知道名称空间别名? 除了使用
#ifndef SWIG
预处理器宏,还有其他解决方法吗?(C.F.(我需要保持我的C++代码独立于SWIG)< /P>
SWIG 2.0.4版似乎确实支持名称空间别名。我认为问题可能出在MyUtils.h中;可能需要设置预处理器定义才能使用名称空间。您可以在SWIG命令行上定义这些名称空间。

假设有一个头

// 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将生成无法编译的代码,原因有很多

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

2) 必须使用名称空间MyUtils::Math编写;使用#include跟随夹杂物

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

namespace MyUtils {
    namespace Math {
        %typedef int SomeType;
    }
}
在使用%include的夹杂物之前


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

在.I文件中包含所有标题非常重要。SWIG不递归头。在使用#include包含头之后,应该使用namespace SomeNameSpace编写;使用%include包含标题后,如果在名称空间中使用了typedef,则可能需要编写名称空间SomeNameSpace{%typedef int SomeIntegerType;}。@jensunk谢谢Jens我有预感这是一种情况,但无法调查。这当然是问题所在,你应该发布一个答案,我很乐意投赞成票。如果你没有时间让我知道,我会扩展我的答案。我试图把我的评论变成一个答案。我希望这能帮助一些游泳爱好者。没有那么多教程。1)你的意思是“包括”还是“包括%?”?;2) 为什么使用名称空间MyUtils::Math?我已经确定了标题中的所有内容。我的意思和我写的完全一样。首先,使用#include指令。对于该部分,必须包含所有文件(SWIG不能递归头文件)。接下来,您需要公开希望SWIG公开的部分,当然,对需要公开的符号使用指令就足够了。此外,如果函数采用参数(在名称空间内定义),则名称空间必须包含函数void fun(array*a),则所有原型都必须完整;必须写入void fun(MyUtils::Math::array*a);我可以向您发送一个包含名称空间和模板的简短示例(太长,无法放在这里)
// MySwigInterfaceFile.i
%module MySwigModule
#include "MyHeader.h

%include "MyHeader.h"
namespace MyUtils {
    namespace Math {
        %typedef int SomeType;
    }
}