const-correctness编译错误到模板函数中的无效转换错误

时间:2018-01-15 15:34:14

标签: c++ c++11 templates

我构建了一个函数,将单个偏移数偏移量展开到索引数组 rindex 。我使用它来获得更高维网格的相应索引。不可否认,这个函数看起来有点古怪的是它的reverse_iterators,但它有效,我现在不知道怎么做不同。

现在,一旦我使 bounds 变量const-qualified,我得到一个关于reverse_iterators的非常神秘的编译时错误。有人可以帮我一点吗?

#include <array>
#include <iostream>
template <typename size_type, typename crIt, typename rIt>
constexpr size_type unpeel(size_type offset, const crIt rbegin, const crIt rend,
                           rIt rindex) {
  for (rIt rit = rbegin; rit != rend; rit++) {
    *rindex++ = offset % *rit;
    offset /= *rit;
  }
  return offset;
}

int main() {
  size_t count = 0;
  constexpr size_t N = 2;
  const std::array<size_t, N> bounds{{2, 3}};
  std::array<size_t, N> index{};
  unpeel(0, bounds.rbegin(), bounds.rend(), index.rbegin());
}

这里有错误的示例: https://ideone.com/nSLPaw

1 个答案:

答案 0 :(得分:1)

迭代器rbegin不能分配给rit - 您需要将其声明为常量迭代器(或简称为auto):

for (auto rit = rbegin; rit != rend; rit++)

既然你正在经过价值,你可以简单地

while (rbegin != rend) {
  *rindex++ = offset % *rbegin;
   offset /= *rbegin++;
}

完整,成功编译,代码:

template <typename size_type, typename InputIterator, typename OutputIterator>
constexpr size_type unpeel(size_type offset,
                           InputIterator rbegin,
                           InputIterator rend,
                           OutputIterator rindex)
{
    for (; rbegin != rend;  ++rbegin) {
        *rindex++ = offset % *rbegin;
        offset /= *rbegin;
    }
    return offset;
}

#include <array>
#include <iostream>
int main() {
    constexpr size_t N = 2;
    const std::array<size_t, N> bounds{{2, 3}};
    std::array<size_t, N> index{};
    unpeel(0, bounds.rbegin(), bounds.rend(), index.rbegin());
}

我已经使用传统的类型名称作为迭代器模板类型,以使要求更加清晰。