违规代码:
template <class Bar,
size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
size_t foo(Bar const& b) { omitted... }
使用-std=c++11
在gcc 4.7.2上编译正常。在clang 3.0上我收到以下错误:
foo.hpp:35:28: error: non-type template argument of type 'unsigned long' is not an integral constant expression
size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
据我所知,我应该能够在c ++ 11中以这种方式使用numeric_limits
。这里的铿锵有误,还是我没有意识到什么?
编辑:
编译标志为:clang++ -o foo.o -c -W -Wall -Wextra -Werror -std=c++11 -stdlib=libc++ -g -I. foo.cpp
答案 0 :(得分:2)
您的代码使用clang ++ 3.2编译得很好,请参阅here。
我想说你的代码没有任何问题,但是你应该升级到更新版本的clang。
注意:由于编译器错误,代码无法使用英特尔C ++编译器13.0.1编译(感谢@Xeo):
Compilation finished with errors:
source.cpp(6): internal error: assertion failed: ensure_il_scope_exists: NULL IL scope (shared/cfe/edgcpfe/il.c, line 7439)
size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
^
compilation aborted for source.cpp (code 4)
答案 1 :(得分:1)
要使用带有clang的C ++ 11库特性,您需要使用libc ++标准库实现,否则您将从GCC 4.1.2获得古老的库,它不支持C ++ 11
请参阅https://stackoverflow.com/a/14790442/981959和https://stackoverflow.com/a/14150421/981959以及许多其他问题。