【发布时间】:2015-11-10 14:41:04
【问题描述】:
目前,我尝试将柠檬库合并到我们的项目中。 大多数开发人员都在 Windows 上,他们使用 MSVC 编译,但我负责(这部分)使用 gcc 和 clang 编译。
我遇到了一个 gcc 无法重现的 clang 错误,我设法减少了代码:
#include <lemon/dfs.h>
int main() {
lemon::ListDigraph g{};
lemon::ListDigraph::Node node = g.nodeFromId(42);
lemon::Dfs<lemon::ListDigraph> dfs{g};
lemon::SimplePath<lemon::ListDigraph> path = dfs.path(node);
return 0;
}
使用 gcc,没有错误。
/usr/bin/g++-5 -std=c++11 -Wall -O3 -I${SRC_ROOT}/external/lemon/latest -I${BIN_ROOT}/lemon -o ${TMP_ROOT}/core/src/core.cpp.o -c ${SRC_ROOT}/core/src/core.cpp
但是用叮当声:
/usr/bin/clang++-3.7 -std=c++11 -Wall -stdlib=libc++ -O3 -I${SRC_ROOT}/external/lemon/latest -I${BIN_ROOT}/lemon -o ${TMP_ROOT}/core/src/core.cpp.o -c ${SRC_ROOT}/core/src/core.cpp
In file included from ${SRC_ROOT}/core/src/core.cpp:1:
In file included from ${SRC_ROOT}/external/lemon/latest/lemon/dfs.h:31:
${SRC_ROOT}/external/lemon/latest/lemon/path.h:408:23: error: no viable
conversion from 'typename PredMapPath<ListDigraph, NodeMap<Arc> >::RevArcIt' to
'lemon::ListDigraphBase::Arc'
data[index] = it;;
^~
注意事项:
-
为便于阅读,
SRC_ROOT、BIN_ROOT、TMP_ROOT已替换 - sn-p 源代码不起作用,但应该可以编译(我会更正真正的大代码)
- 我真的需要真正的源代码的c++11特性。
-
gcc5 -
clang3.7 -
lemon1.3.1
问题:
- 我是不是忘记挂旗了?
- lemon 是否与 clang 完全兼容?
- 如何解决这个错误?
【问题讨论】:
-
您使用的是哪个柠檬发布/开发版本?
-
已编辑(柠檬 1.3.1)
-
谢谢;使用 clang++-3.5 可以毫不费力地重现该错误(这稍微扩大了受众范围)。这是关于尝试将 ReverseIterators 分配给 ForwardIterators 的老问题;
lemon/path.h上面的 forward it 块在没有警告的情况下编译。 -
不,不是;至少非专业的 RevIt 有一个演员
operator Arc (). -
奇怪的是,我尝试在没有
-std=c++11和-stdlib=libc++的情况下进行编译,并且它在没有警告的情况下工作(修改原始代码以不使用初始化列表)。
标签: c++11 g++ clang++ lemon-graph-library