SWIG 解析器错误

SWIG parser error

我有以下 header 文件。

#include <string>

namespace A {
namespace B {

    struct Msg {
        std::string id;
        std::string msg;

        Msg(std::string new_id, std::string new_msg)
        : id(new_id), msg(new_msg)
        {
        }
    };

    template<bool HAS_ID>
    class ID {
    public:
        template<typename TOBJ>
        auto get(TOBJ parent) -> decltype(parent.id()) {
            return parent.id();
        }
    };   
} // namespace B
} // namespace A

当我痛饮它时,它给我一个错误

Error: Syntax error in input(3). 在第 20 行指向第

auto get(TOBJ parent) -> decltype(parent.id())

目标语言是 Java

我该如何解决这个问题?我只想为 Msg 结构创建包装器,而不是 header 中的其他任何东西。由于这看起来像是 Swig 解析器错误,因此使用 %ignore 指令似乎不起作用。

谢谢

尽管 SWIG 3.x 添加了有限的 decltype 支持,但目前您的情况似乎不受支持。 (参见 decltype limitations

我认为您目前最好的办法是将有问题的代码包围在预处理器宏中以将其隐藏,例如:

#include <string>

namespace A {
namespace B {

    struct Msg {
        std::string id;
        std::string msg;

        Msg(std::string new_id, std::string new_msg)
        : id(new_id), msg(new_msg)
        {
        }
    };

    template<bool HAS_ID>
    class ID {
    public:
#ifndef SWIG
        template<typename TOBJ>
        auto get(TOBJ parent) -> decltype(parent.id()) {
            return parent.id();
        }
#endif
    };   
} // namespace B
} // namespace A

如果您出于某种原因无法像那样编辑文件,有两种选择:

  1. 不要对不解析的头文件使用%include。而是写这样的东西:

    %{
    #include "header.h" // Not parsed by SWIG here though
    %}
    
    namespace A {
    namespace B {
    
        struct Msg {
            std::string id;
            std::string msg;
    
            Msg(std::string new_id, std::string new_msg)
            : id(new_id), msg(new_msg)
            {
            }
        };
    
    } // namespace B
    } // namespace A
    
    in your .i file, which simply tells SWIG about the type you want to wrap and glosses over the one that doesn't work.
    
  2. 或者使用预处理器发挥创意并找到一种使用 bodge 隐藏它的方法,在您的 .i 文件中您可以编写如下内容:

    #define auto // \
    void ignore_me();
    
    %ignore ignore_me;
    

    另一个类似的方法是隐藏 decltype 的内容:

    #define decltype(x) void*
    

    这只是告诉 SWIG 假定所有 decltype 用法都是空指针。 (需要 SWIG 3.x 并且可以与应该忽略的 %ignore 结合使用,或者一个类型映射来真正修复它)