gpt4 book ai didi

SWIG 解析器错误

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:43 25 4
gpt4 key购买 nike

我有以下头文件。

#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

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

错误:input(3) 中的语法错误。 在第 20 行指向行

自动获取(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 结合使用,或者与真正修复它的类型映射结合使用)

关于SWIG 解析器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com