【发布时间】:2018-11-26 04:25:00
【问题描述】:
See it here. 这个程序很平凡,就像这样:
#include <vector>
std::vector<int> bombs;
int main()
{
bombs.push_back(42); // compile errors
}
诊断对我来说没有多大意义:
在 main.cpp:1 中包含的文件中:
在包含的文件中 /usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/vector:60:
在包含的文件中 /usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits/stl_algobase。小时:64:
在包含的文件中 /usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits/stl_pair。小时:59:
在包含的文件中 /usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits/move.小时:55:
/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/type_traits :1061:48: 错误:'_Tp' 没有引用值
: public __bool_constant<__is_assignable(_Tp, _Up)> ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/type_traits :1059:21: 注意:这里声明
template<typename _Tp, typename _Up> ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/type_traits :1061:53: 错误:
_Up没有引用值: public __bool_constant<__is_assignable(_Tp, _Up)> ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/type_traits :1059:35: 注意:这里声明
template<typename _Tp, typename _Up> ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/type_traits :1062:5: 错误:预期的类名
{ }; ^在 main.cpp:1 中包含的文件中:
在包含的文件中 /usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/vector:63:
/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits /stl_uninitialized.h:128:70: 错误:
std::is_assignable<int &, int &&>中没有名为value的成员const bool __assignable = is_assignable<_RefType2, _RefType1>::value; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits /stl_uninitialized.h:289:19: 注意:在函数模板特化的实例化中
std::uninitialized_copy<std::move_iterator<int *>, int *>已请求 这里{ return std::uninitialized_copy(__first, __last, __result); } ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits /stl_uninitialized.h:310:19: 注意:在函数模板特化的实例化中
std::__uninitialized_copy_a<std::move_iterator<int *>, int *, int>在这里请求return std::__uninitialized_copy_a ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits /vector.tcc:446:13: 注意:在函数模板特化的实例化
std::__uninitialized_move_if_noexcept_a<int *, int *, std::allocator<int> >此处请求= std::__uninitialized_move_if_noexcept_a ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits /vector.tcc:109:4: 注意:在函数模板特化的实例化中
std::vector<int, std::allocator<int> >::_M_realloc_insert<int>在这里请求_M_realloc_insert(end(), std::forward<_Args>(__args)...); ^/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/bits /stl_vector.h:1091:9: 注意:在函数模板特化的实例化中
std::vector<int, std::allocator<int> >::emplace_back<int>已请求 这里{ emplace_back(std::move(__x)); } ^main.cpp:7:9: 注意:在成员函数的实例化中
std::vector<int, std::allocator<int> >::push_back在这里请求bombs.push_back(42); ^产生了 4 个错误。
与 g++ 编译相同,没有任何问题。实在看不下去 Coliru 的 Clang 包含的库头文件,用于编程以自行解决。有没有人知道什么是错的以及如何克服这个问题?
【问题讨论】:
-
适用于 clang6,所以可能是由于使用旧的 clang 版本和较新的 libstdc++ 8.1 导致的一些错误。
-
较新的 libstdc++ 和非常旧的 clang 之间可能不兼容。
-
@StackedCrooked 谢谢!但是经典的 Hello World 仍然没有与 Clang 链接:coliru.stacked-crooked.com/a/5518c6dd74de1e6f
-
@ÖöTiib 如果您使用
clang++而不是clang,则该文件将特别编译。