2

违规代码:

template <class Bar, 
         size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
size_t foo(Bar const& b) { omitted... }

它在 gcc 4.7.2 上使用-std=c++11. 在 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()>
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

据我所知,我应该能够numeric_limits在 c++11 中以这种方式使用。这里是clang错了,还是我不知道什么?

编辑:

编译标志是:clang++ -o foo.o -c -W -Wall -Wextra -Werror -std=c++11 -stdlib=libc++ -g -I. foo.cpp

4

2 回答 2

2

您的代码使用 clang++ 3.2 编译得很好,请参见此处

我会说您的代码没有问题,但您应该升级到更新版本的 clang。

注意:由于编译器错误(感谢@Xeo),代码无法使用英特尔 C++ 编译器 13.0.1 进行编译:

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)
于 2013-02-13T13:01:58.567 回答
1

要在 clang 中使用 C++11 库功能,您需要使用 libc++ 标准库实现,否则您会从不支持 C++11 的 GCC 4.1.2 获得古老的库

请参阅https://stackoverflow.com/a/14790442/981959https://stackoverflow.com/a/14150421/981959以及许多其他问题。

于 2013-02-13T12:43:20.690 回答