【发布时间】:2021-03-01 00:17:19
【问题描述】:
我正在尝试构建一个 c++ 项目。使用 g++ 时,项目编译得很好。但是,如果我尝试使用 clang 进行编译,则会出现错误:
ec_read_plan.h:135:19: error: loop variable 'op' creates a copy from type 'const std::pair<ChunkPartType, ReadPlan::ReadOperation>' [-Werror,-Wrange-loop-construct]
for (const auto op : read_operationss_{
ec_read_plan.h:135:8: note: use reference type 'const std:pair<ChunkPartType, ReadPlan::ReadOperation> &' to prevent copying
for (const auto op : read_operations) {
代码如下,我在给出错误的那一行添加了注释:
protected:
void recoverParts(uint8_t *buffer,
const std::bitset<Goal::Slice::kMaxPartsCount> &available_parts) const {
typedef ReedSolomon<slice_traits::ec::kMaxDataCount, slice_traits::ec::kMaxParityCount> RS;
int k = slice_traits::ec::getNumberOfDataParts(slice_type);
int m = slice_traits::ec::getNumberOfParityParts(slice_type);
int max_parts = k + m;
RS::ConstFragmentMap data_parts{{0}};
RS::FragmentMap result_parts{{0}};
RS::ErasedMap erased;
RS rs(k, m);
int available_count = 0;
for (int i = 0; i < max_parts; ++i) {
if (!available_parts[i] || available_count >= k) {
erased.set(i);
} else {
available_count++;
}
}
for (const auto op : read_operations) { //ERROR appears to be here
data_parts[op.first.getSlicePart()] = buffer + op.second.buffer_offset;
}
for (int i = 0; i < (int)requested_parts.size(); ++i) {
if (!available_parts[requested_parts[i].part]) {
result_parts[requested_parts[i].part] = buffer + i * buffer_part_size;
}
}
rs.recover(data_parts, erased, result_parts, buffer_part_size);
}
为什么我在使用 Clang 时遇到这样的错误,我该如何解决?谢谢。
对于可能想要重现错误的任何人,源代码在这里:https://github.com/lizardfs/lizardfs。然后做:
export CC=/usr/bin/clang
export CC=/usr/bin/clang++
cd lizardfs
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/lizardfs
make
【问题讨论】:
-
不幸的是,任何人都不太可能告诉您为什么“遇到这样的错误”。这是因为显示的代码不符合 minimal reproducible example 的要求,如 help center 中所述,因此任何人都无法剪切/粘贴给定的代码,完全如图所示 i> 并重现您的确切编译错误。
-
刚刚提供了通过从源代码构建来获取错误的方法。
-
我认为错误信息很好地解释了错误,它甚至提出了修复它的解决方案。
-
不太可能有人会在 github 上下载整个项目来回答这个问题。提高获得问题帮助机会的最好方法是让其他人尽可能容易地重现问题,最简单的方法是提供一个简短的代码示例,不超过几页。几年前,我在 xwfm4 窗口管理器中发现了一个错误。我没有告诉 XFCE 维护人员去下载几千行代码,而是创建了一个 20 行的错误复制器,他们跳上去修复了错误。
-
也许你想要
for (const auto& op : read_operations)。