2011-12-16 5 views
7

新しい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を受け取りました。問題はありませんが、理由を詳しく説明してください。将来の質問を改善するのに役立ち、結局はコミュニティ全体が利益を得るでしょう。ありがとう!

+3

GCCのバグのような音は、MSVC 10でうまくコンパイルできます.Lambdaをまだ実装していないので、Clangでテストすることはできません。 FWIW、GCC 4.5.1は[この最小化されたコード](http://ideone.com/LdGJT)には問題ありません。 – Xeo

+0

はい、私はClangのstd ::と一緒にテストしましたが、今のところラムダがないので不可能です。 – Piotr99

+1

不要なコードがすべて削除されたバージョンを作成し、エラーメッセージを提供する必要があります。 – Mankarse

答えて

8

forループの変数pairの名前を変更してください。

それはスコープのみforループの終わりまで、したがって、あなたの ラムダを妨げるが、それはそうではなかった古代のために、スコープの規則のためのいくつかのコードを持っ++グラム、それは良く発光させることができるべきではないのです古いC++コードのエラーメッセージ。

互換性コードにバグがあるようです。

+0

はい、ありがとう!それは本当です - それは動作するforループ内の別の変数名で!それでも、私はあなたに同意します、それはループのスコープに限定されるべきです... – Piotr99

+1

記録のために、すでにgccバグレポートがあります:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10852 - ラムダは単にエラーメッセージを悪化させます。 – wolfgang

+0

うわー、知っておいてよかった! – Piotr99

関連する問題