2

このコードをコンパイルすると:

template<typename T>
struct S {
  std::vector<T> v;
  S(initializer_list<T> l) : v(l) {
    std::cout << "constructed with a " << l.size() << "-element list\n";
  }
};

次のコマンド ラインを使用します。

 clang++ -std=c++11 -stdlib=libc++ initializer_list.cpp

次のエラーが表示されます。

initializer_list.cpp:12:23: error: expected ')'
    S(initializer_list<T> l) : v(l) {

誰かが修正を知っていますか??

前もって感謝します

4

2 に答える 2

3

あなたはおそらく書くつもりstd::initializer_list<T>でした。を必ず含めてください<initializer_list>

于 2012-06-12T12:06:41.457 に答える
2

あなたのコード サンプルは不完全です。完全な例を提供できると便利です。書かれたコードの問題は、あなたが欠けていることです

#include <initializer_list>
#include <vector>
#include <iostream>

...そしてinitializer_listnamespaceにあるため、コンストラクター宣言からstda も欠落しています。std::

ただし、これらのどちらも問題ではないと主張しているため、最も可能性の高い原因は、C++ 標準ライブラリの実装が提供していないことstd::initializer_listです。これは、Clang が GCC の libstdc++ を使用していて、その適切な新しいバージョンがインストールされていない場合に当てはまります。少なくともバージョン 4.4が必要ですが、libstdc++-4.4 のバグを修正するにはパッチが必要であることに注意してください。 C++11 モードの Clang で動作します。そうしないと、エラーtype_infoやその他のさまざまな問題が発生します。

また、あなたが受けた診断結果は次のとおりです。

initializer_list.cpp:12:23: error: expected ')'
    S(initializer_list<T> l) : v(l) {
                      ^

(提供された列番号からキャレットを再構築しました。将来の質問でそれを保持すると便利です。)上記の説明のいずれについても、これは Clang が生成する最初の診断ではありません。それは次のようなものです:

initializer_list.cpp:12:5: error: no template named 'initializer_list'; did you mean 'std::initializer_list'?
  S(initializer_list<T> l) : v(l) {
    ^~~~~~~~~~~~~~~~
    std::initializer_list

したがって、質問から最初の診断を逃したか、問題は、質問で省略したコードで名前が付けられた他の(非template) タイプを宣言していて、それが隠れていることです。コードの残りの部分または診断の残りの部分を確認しないと、どちらを判断することはできません。initializer_liststd::initializer_list

于 2012-09-15T07:25:41.893 に答える