当 Visual Studio 运行良好时,向量迭代器上的 LInux g++ 编译器错误

求真者27

我已经在 Visual Studio 2017 Enterprise 上成功编译了一个 C++ 文件分配程序,没有任何问题。但是,当我尝试在带有 GCC 4.8.5 的 Red Hat Linux 服务器上编译相同的程序时,我在我使用的向量/迭代器上遇到了错误。这是我的向量使用的嵌套结构和类型:

    struct FATPtr
{
    string filename;
    int fileByte;

    bool operator< (const FATPtr& other) const          // overloaded < operator to compare two FAT pointers;
    {                                                   // comparison is by filename
        return filename < other.filename;
    }

    bool operator< (const string& fname) const          // overloaded < operator to compare FAT pointer filename
    {                                                   // to another filename
        return filename < fname;
    }
};

FATPtr fatPtr;                                          // pointer to a file allocation table entry
vector<FATPtr> fatVector;                               // vector to hold these pointers    

这是生成错误的代码:

    // insert FAT filename and location into sorted vector
fatPtr.filename = filename;
fatPtr.fileByte = fatByte;
auto at = lower_bound(fatVector.cbegin(), fatVector.cend(), filename);
fatVector.insert(at, fatPtr);

void DiskInterface::deleteFATEntry(Disk& dsk, string filename, int entry)
{
    auto at = lower_bound(fatVector.cbegin(), fatVector.cend(), filename);
    fatVector.erase(at);

    dsk.writeFAT(entry);
}

具体来说,“at”迭代器在向量插入和擦除方法中抛出错误:

{cslinux1:~/CS4348/Project3} g++ -std=c++0x Project3.cpp -o Project3
Project3.cpp: In member function ‘void DiskInterface::addFAT(Disk&, std::string, int, int)’:
Project3.cpp:248:29: error: no matching function for call to ‘std::vector<DiskInterface::FATPtr>::insert(__gnu_cxx::__normal_iterator<const DiskInterface::FATPtr*, std::vector<DiskInterface::FATPtr> >&, DiskInterface::FATPtr&)’
  fatVector.insert(at, fatPtr);
米哈伊尔

GCC 4.8.5 无法处理std::vector::insertand std::vector::erase( The GNU C++ Library Manual - 1.1 Implementation Status - 23.3.6 ) 中的常量迭代器

更改您的来电cbegin(),并cend()begin()end()

auto at = lower_bound(fatVector.begin(), fatVector.end(), filename);

您的代码可以在更高版本中正常编译。

看起来像@UncleBens 指出的语言标准中的缺陷容器插入/擦除和迭代器常量(修订版 1))N2350)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章