忽略运算符的重新定义<<在swig界面中

时间:2014-03-19 21:30:02

标签: python c++ swig

我在具有相同签名的不同命名空间中有两个版本的operator<<。由于swig将它们分成单个名称空间,因此它们彼此冲突,阻止我运行界面。

我不需要使用脚本语言(Python)中的stream-insertion运算符, 有没有办法压制这些。

%ignore指令似乎无济于事。

最小化测试设置

标题文件

//file:test.h
#include <iostream>
#include <boost/numeric/ublas/vector.hpp>

namespace probabilities{
    typedef boost::numeric::ublas::vector< double > UnivariateTable;

    inline 
    std::ostream& operator<<( std::ostream& ostr, const UnivariateTable& table){
       ostr<<"I am a table";
       return ostr;
    }


}

namespace positions{
    typedef boost::numeric::ublas::vector< double > PositionVector;
    inline 
    std::ostream& operator<<(std::ostream& ostr, const PositionVector& vect){
        ostr<<"I am a vector";
        return ostr;
    }
}

Swig界面文件

//file:test.i
%module test

%{
#include "test.h"
%}

%ignore operator<<;
%include "test.h"

结果

[dmcnamara]$ swig -c++ -python -I/opt/vista_deps/include -I/opt/vista/include test.i 
test.h:26: Error: '__lshift__' is multiply defined in the generated target  language module in scope .
test.h:15: Error: Previous declaration of '__lshift__'

2 个答案:

答案 0 :(得分:2)

在写这个问题的过程中,我意识到了答案:

您需要为%ignore指令指定名称空间:

%ignore positions::operator<<
%ignore probabilities::operator<<

答案 1 :(得分:1)

您还可以使用预处理工具:

//file:test.h
#include <iostream>
#include <boost/numeric/ublas/vector.hpp>

namespace probabilities{
    typedef boost::numeric::ublas::vector< double > UnivariateTable;
    #ifndef SWIG
    inline 
    std::ostream& operator<<( std::ostream& ostr, const UnivariateTable& table){
       ostr<<"I am a table";
       return ostr;
    }
    #endif


}

namespace positions{
    typedef boost::numeric::ublas::vector< double > PositionVector;
    #ifndef SWIG
    inline 
    std::ostream& operator<<(std::ostream& ostr, const PositionVector& vect){
        ostr<<"I am a vector";
        return ostr;
    }
    #endif
}