2016-12-21 15 views
1

私はこのトップコードリンクからhttps://www.topcoder.com/community/data-science/data-science-tutorials/power-up-c-with-the-standard-template-library-part-1/ のC++(STL)を学習しており、初めて学習するマクロを使用しています。 私は、次の方法でそれを使用しようとしていますが、多少の誤差は取得しています:typeof演算子を使用しているマクロを使用しているマクロ

#include <iostream> 
#include <vector> 
#include <set> 

//Macros 

#define tr(container, it)\ 
    for(typeof(container.begin()) it = container.begin(); it!=container.end(); it++); 

using namespace std; 

int main() 
{ 
    set< pair<string, pair< int, vector<int> > > >SS; 
    int total = 0; 
    tr(SS, it) { 
     total += it->second.first; 
    } 
    return 0; 
} 

エラー:マクロを使用して行で、私はエラーを取得しています - >「は」はこのスコープで宣言されていません。助けてください!ありがとう!

+0

は、それを手に入れたセミコロンを削除し、どうもありがとうございました!! –

+0

このようなマクロは使用しないでください...現代のC++には、自家製マクロに頼ることなく同じことを可能にする、あらかじめ定義された構造があります。範囲ベースのforループ。 – Holt

+1

'typeof'は標準のC++ではありません。それはgccの拡張だと私は​​信じています。 C++ 11では、 'auto it'またはそれ以上の範囲のループを使うことができます。 – Incomputable

答えて

5

forループの後にセミコロンがあります。それを除く。

+0

ありがとうございました! –

2

プリプロセッサディレクティブは実際のC++言語の一部ではないため、C++のすべての規則に従っているわけではありません。これには、セミコロンで終了しないことが含まれます。

最後にセミコロンを使用するとマクロ展開に含められます。拡張されたときにそれがループするための手段は、次のようになります。

for(typeof(SS.begin()) it = SS.begin(); it!=SS.end(); it++);) { 
    total += it->second.first; 
} 

ループ本体は、そのセミコロンによって作成された空の声明で、{}で囲まれたブロックがループの一部ではありません。


また、マクロの使用を控えてください。 C++では、マクロの必要性が大幅に減少しました。この状況ではマクロは必要ありません。実際には関数でもありません(マクロを置き換える通常の方法です)。実際に

、あなたは比較的近代的かつ最新のコンパイラを持っているならば、あなたはrange-based for loopを使用することができます。

for (auto const& p : SS) { 
    total += p.second.first; 
} 
+0

最後にセミコロンを使わないのはなぜでしょうか? –

関連する問題