Python 的 Visual C++ 无法处理 c++11 错误 C2039:"data":不是 std::vector 的成员



使用python setup.py安装时遇到编译错误,错误如下:

 : error C2039: 'data' : is not a member of 'std::vector<_Ty>'
        with
        [
            _Ty=unsigned int
        ]

Microsoft Visual有一个用于Python的VC++,它使用Visual C++2008,它不支持C++11(我认为这是该部分代码工作所必需的。

std::vector<unsigned> tab((m + 1) * 2);
unsigned *cur = tab.data(), *prev = tab.data() + m + 1;

对于这部分代码,或者强制python安装使用MV C++2015,有什么变通方法吗。

整个代码在这里:https://github.com/semanticize/leven/blob/master/leven/levenshtein_impl.h

std::vector保证连续存储其数据,因此您只需获取其第一个元素的地址:

unsigned *cur = &tab[0], *prev = &tab[0] + m + 1;

或者可能会更清楚:

unsigned *cur = &tab[0];
unsigned *prev = cur + m + 1;

您可以使用:而不是vector::data()

&tab[0] // or &tab.front()

以获取指向矢量数据的指针。因此,您的代码将如下所示:

std::vector<unsigned> tab((m + 1) * 2);
unsigned *cur = &tab[0], *prev = &tab[0] + m + 1;

&tab[0]的一个问题是,如果选项卡为空,那么这将导致"未定义的行为",至少在Visual Studio下会崩溃。在VS2015下,对空向量调用data()会得到nullptr。如果向量为空,std::vector::data()应该返回什么?这应该是未指明的行为。在您的代码矢量中,看起来它在那个位置永远不应该是空的,但为了确保您可以使用以下代码来确保:

unsigned *cur = (tab.empty() ? NULL : &tab[0]), *prev = (tab.empty() ? NULL : &tab[0]) + m + 1;

最新更新