【问题标题】:Can't wrap a template static function with swig无法用 swig 包装模板静态函数
【发布时间】:2014-09-04 10:33:08
【问题描述】:

我正在尝试像这样包装一个简单的静态模板函数:

namespace ns {
  class A {
   public:
    template<typename T>
    static void func() {}
  };
}

使用 swig 指令:

%template(func_type) ns::A::func<type>;

但我不断得到:

Error: Undefined scope 'ns::A'
Error: Template 'ns::A::func' undefined.

我在this mailing list 上发现了同样的问题,但遗憾的是没有回复。这是痛饮限制吗?需要特殊操作吗?


以下是上面几行准备粘贴到 .i 文件中的内容:

%module example
%{
namespace ns {
  class A {
   public:
    template<typename T>
    static void func() {}
  };
}
%}

%template(func_int) ns::A::func<int>;

要使用 swig 处理这个,只需:

swig -c++ -tcl test.i

【问题讨论】:

    标签: templates static swig


    【解决方案1】:

    现在我解决了这个问题,声明了一些 swig 可以更好地管理的虚拟函数:

    namespace ns {
      class A {
       public:
        template<typename T>
        static void func() {}
    
        static void funcT1() {func<T1>();}
        static void funcT2() {func<T2>();}
      };
    }
    

    我认为它足够干净,但我仍在寻找更合适的解决方案。

    【讨论】:

      【解决方案2】:

      你必须给它一个特定的类型:

      %template(func_int) ns::A::func<int>;
      %template(func_float) ns::A::func<float>;
      

      您可能还(无法在此处测试)必须使用命名空间包装 %template

      namespace ns {
          %template(func_int)   A::func<int>;
          %template(func_float) A::func<float>;
      }
      

      【讨论】:

      • 是的,这正是我所做的,但我遇到了描述的错误。你试过这个吗?你成功了吗?
      • 也许你必须用命名空间包装(更新了我的答案)。如果这没有帮助,那么您的 .i 中肯定有其他问题。也许扩展您的帖子以包含一个完整但最小的 .i 重现问题。
      • 完整和最小的 .i 已经几乎存在于问题中,但我添加了它。我也尝试了您的第二个建议,但没有任何区别。
      • 我把它放在那里是因为我有它在真实的代码中,但它真的没有什么区别。没有模板的错误是Error: Undefined scope 'A' Error: Template 'A::func' undefined.
      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      相关资源
      最近更新 更多