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にアップグレードする必要があります。

注:コンパイラのバグが原因で、コードはIntel 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)
于 2013-02-13T13:01:58.567 に答える
1

clangでC++11ライブラリ機能を使用するには、libc ++標準ライブラリ実装を使用する必要があります。そうでない場合は、C++11をサポートしないGCC4.1.2から古いライブラリを取得します。

https://stackoverflow.com/a/14790442/981959https://stackoverflow.com/a/14150421/981959および他の多くの質問を参照してください。

于 2013-02-13T12:43:20.690 に答える