新しいC++ 11標準(g ++ 4.6.2を使用)のいくつかを発見しようとしましたが、 。 "all_of"アルゴリズム関数でlambdaを使って遊んで、std :: qualifierに奇妙な問題が発生しました。C++ 11/g ++:std :: qualifierがラムダで必要ですが、 "using namespace std"が与えられました
私は、コードスニペットの先頭に示すように、std名前空間を「使用」しています。これにより、forループ内のpair変数の宣言が明確になります。
しかし、 "all_of"アルゴリズムで使用されたlambda引数で同じことを試みました。完全なstd :: qualified std :: pairがそこでは動作するが、ペアではないことに気付く前に、いくつかの分かりにくいエラーメッセージが出てきました。
重要な点はありませんか?ラムダの宣言はこのファイルで起こるので、ネームスペースはここでもアクティブでなければなりません。または、必要なstd :: qualifierは、別のファイルの一部のSTLコードに依存していますか?または、g ++のバグである可能性がありますか?
敬具、 ピーター
PS:コードはここに貼り付けると、警告なしでコンパイルが、STDを削除:: all_ofラムダでは、私はエラーメッセージが表示されます。
#include <iostream>
#include <memory>
#include <map>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;
void duckburg() {
const int threshold = 100;
map <string, int> money;
money["donald"] = 200;
money["daisy"] = 400;
money["scrooge"] = 2000000;
// obviously, an "auto" type would work here nicely,
// but this way my problem is illustrated more clearly:
for (const pair <string, int> &pair : money) {
cout << pair.first << "\t" << pair.second << endl;
}
if (all_of(money.begin(), money.end(),
[&](std::pair<string, int> p) {
return bool(p.second > threshold);
}))
{
cout << "yes, everyone is rich!";
} else {
cout << "no, some are poor!";
};
}
編集:ちょうど私はこの古い質問のdownvoteを受け取りました。問題はありませんが、理由を詳しく説明してください。将来の質問を改善するのに役立ち、結局はコミュニティ全体が利益を得るでしょう。ありがとう!
GCCのバグのような音は、MSVC 10でうまくコンパイルできます.Lambdaをまだ実装していないので、Clangでテストすることはできません。 FWIW、GCC 4.5.1は[この最小化されたコード](http://ideone.com/LdGJT)には問題ありません。 – Xeo
はい、私はClangのstd ::と一緒にテストしましたが、今のところラムダがないので不可能です。 – Piotr99
不要なコードがすべて削除されたバージョンを作成し、エラーメッセージを提供する必要があります。 – Mankarse