操作员的Swig警告支持[] 我有一点C++,我想用Python来访问。

操作员的Swig警告支持[] 我有一点C++,我想用Python来访问。,python,c++,swig,Python,C++,Swig,DynamicArray.h: #include <vector> #include <stdexcept> namespace mspace { template <class T> class DynamicArray { // lets piggyback on std::vector. std::vector<T> m_implementation; public:

DynamicArray.h:

#include <vector>
#include <stdexcept>

namespace mspace {

    template <class T>
    class DynamicArray {

        // lets piggyback on std::vector.
        std::vector<T> m_implementation;

    public:

        typedef std::vector::size_type size_type;
        typedef T& reference;
        typedef const T& const_reference;

        const_reference operator [](size_type i) const noexcept(false)
        {
            if (i >= m_implementation.size())
                throw std::out_of_range("Ouch i >= DynamicArray.size() ");
            return m_implementation[i];
        }

        reference operator[](size_type i) noexcept(false)
        {
            if (i >= m_implementation.size())
                throw std::out_of_range("Ouch i >= DynamicArray.size() ");
            return m_implementation[i];
        }
    };
}
我将swig作为:
swig-python-c++-Wall-array.I
swig-python-builtin-c++-Wall-array.I

我将使用ubuntu-16.04存储库中的swig 3.0.8

我希望看到警告,但也希望在我通过extend解决这些警告时删除它们。有人知道我错过了什么吗。
因为,我担心在我的项目中,我错过了我尚未解决的警告,因为随着我的项目的发展,这些警告的列表不断增加。

正如@Davis Herring在下面的问题评论中所建议的那样。可以使用swig使用的预处理器标志,如
-DSWIG
。您可以使用条件编译,或者在swig的情况下使用代码生成。也许这个方法是次优的,因为你需要能够改变C++头文件。
#include <vector>
#include <stdexcept>

namespace mspace {

template <class T>
class DynamicArray {

    // lets piggyback on std::vector.
    std::vector<T> m_implementation;

public:

    typedef std::vector::size_type size_type;
    typedef T& reference;
    typedef const T& const_reference;

#ifndef SWIG
    const_reference operator [](size_type i) const noexcept(false)
    {
        if (i >= m_implementation.size())
            throw std::out_of_range("Ouch i >= DynamicArray.size() ");
        return m_implementation[i];
    }

    reference operator[](size_type i) noexcept(false)
    {
        if (i >= m_implementation.size())
            throw std::out_of_range("Ouch i >= DynamicArray.size() ");
        return m_implementation[i];
    }
#endif
};

}
#包括
#包括
命名空间mspace{
模板
卡雷级{
//让我们借助std::vector。
std::向量m_实现;
公众:
typedef std::vector::size\u type size\u type;
typedef T&reference;
类型定义常数T和常数U参考;
#ifndef SWIG
常量引用运算符[](大小\类型i)常量noexcept(false)
{
if(i>=m_implementation.size())
抛出std::超出范围(“哎哟我>=DynamicArray.size()”;
返回m_实现[i];
}
参考运算符[](大小\类型i)无异常(假)
{
if(i>=m_implementation.size())
抛出std::超出范围(“哎哟我>=DynamicArray.size()”;
返回m_实现[i];
}
#恩迪夫
};
}
这将起作用,因为可以使用
%extend
来实现getitem,或者在使用
swig-c++-python-builtin
时使用python插槽,但是我很乐意标记一个使用swig接口文件中的警告抑制的答案。当编译生成的代码时,使用了A+C++编译器,因此可以从扩展中的代码中使用DyrimeCART::运算符[]。
但是,由于不是每个人都可以通过在代码中添加许多<代码> > IFNDEFS SWIG/C++ >来减少C++头,并减少代码污染,我很乐意接受一个答案,它使用SWIG提供的接口文件中的抑制方法。(不改变其行为以用于其他用途)“我也用C++ C++的头”,所以如果使用C++解决了一个解决方案,使用“代码> > IFIFF SWIG……{ NEDF < /COD> SWIG,我可能愿意。但是主要目标是能够在C++中动态地压缩动态数组,并且可以在SWIG支持的语言中很容易地使用。-将
#ifdef
操作符[]移开,然后使用
%extend
将它们带回来(在Python名称下)不起作用吗这当然可以,但是根据DOCs<代码> %WalnFrase也可以工作,而不污染带有“γIFIFF”的C++头文件……但是有时必须选择两个邪恶的较小的。许多错误的肯定警告肯定是邪恶的,所以也许是最好的。好的。你可以在几天内回答你自己的问题来帮助OTH。不知道将
#ifdef SWIG
作为解决方法的用户,或编辑它以排除答案。
#include <vector>
#include <stdexcept>

namespace mspace {

template <class T>
class DynamicArray {

    // lets piggyback on std::vector.
    std::vector<T> m_implementation;

public:

    typedef std::vector::size_type size_type;
    typedef T& reference;
    typedef const T& const_reference;

#ifndef SWIG
    const_reference operator [](size_type i) const noexcept(false)
    {
        if (i >= m_implementation.size())
            throw std::out_of_range("Ouch i >= DynamicArray.size() ");
        return m_implementation[i];
    }

    reference operator[](size_type i) noexcept(false)
    {
        if (i >= m_implementation.size())
            throw std::out_of_range("Ouch i >= DynamicArray.size() ");
        return m_implementation[i];
    }
#endif
};

}