我在具有相同签名的不同命名空间中有两个版本的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__'
答案 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
}