c++ - Visual Studio 中的 std::transform 使用自己的迭代器失败

标签 c++ algorithm visual-c++ c++11 compiler-errors

在一个更大的项目中,我定义了一些类,它以非常简约的方式定义了自己的迭代器。到现在我给了我的代码gcc和clang,他们吃了,编译后很开心。

今天我尝试将我的项目移植到 MSVC..... 嗯……

在意识到 MSVC 不支持诸如 snprintf 或 noexcept 关键字之类的内容后,我陷入了下一段。其实我想我知道出了什么问题,但我想知道为什么 MSVC 会这样,以及是否有任何“简单”的方法来解决这个问题。

这是一个简单的例子:

#include <algorithm>
#include <iostream>
#include <vector>

class Test {
public:
    Test(size_t size) : _size(size) {

    };

    class Iterator {
    public:
        Iterator& operator ++() {
            _position++;
            return *this;
        }

        size_t operator *() {
            return _position;
        }

        bool operator !=(const Iterator &rhs) {
            return _position != rhs._position;
        }
    private:
        friend class Test;
        Iterator(size_t position) : _position(position) {};
        size_t _position;
    };

    Iterator begin() {
        return Iterator(0);
    }

    Iterator end() {
        return Iterator(_size);
    }

private:
    size_t _size;
};

int main()
{

    Test t(10);

    for (auto val : t) // however, this works with MSVC
    {
        std::cout << val << std::endl;
    }

    std::vector<size_t> out(10);

    // Here it crashes
    std::transform(t.begin(), t.end(), out.begin(), [] (size_t i) {
        return i;
    });

    return 0;
}

此代码使用 clang 或 gcc 成功编译。

Here是 MSVC 的编译器输出(对于德语编译器输出很抱歉,我是 Windows 的新手,我什至不知道如何更改语言...老实说,我花了几天时间安装 Windows -.-)

那么让我们来分析一下哪里出了问题。

MSVC 声明了一些缺失的类型,例如“iterator_category”和许多其他内容。 但它为什么要这样做呢? “std::transform()”使用的所有类型实际上都可以通过 Iterator 类成员的返回类型推导出来,我想这就是 clang 或 gcc 的工作方式。

我不想写下所有这些类型和定义。如果我这样做,迭代器将比底层类本身更大!

最佳答案

解决方案:继承自std::iterator<input_iterator_tag, size_t>

问题是 MSVC 不知道您的迭代器是 前向 一个输入迭代器。这不能从返回类型中推导出来。

关于c++ - Visual Studio 中的 std::transform 使用自己的迭代器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088517/

相关文章:

c++ - 在 C++ 中重新实现 dos2unix 和 unix2dos; '\r' 和 '\n' 没有出现在 hexdump 中?

algorithm - 具有 Log n 重组的主定理

c++ - 我们能否获得从 windbg 中的 mdmp 或 hdmp 发生的倒数第二个异常

C++从类内部调用类外部的方法

C++ 修改这些对象的 vector 中所有对象的给定成员的最佳方法

Python闰年计算器(用户选择的两年之间)

java - Java中敌人追赶玩家的二维数组

c++ - 如何释放重新分配的内存? C++

c++ - 如何处理坏指针

c++ - 如果 a 是 cv::Mat 和 cv::Mat b=a.row(1),那么这两个 cv::Mat 实例有什么区别?