2013-09-23 31 views
5

私は、次の非常に奇妙な状況を持っている...私のVisual Studioコンパイラ2010以下のコード好きではない:のVisual Studio 2010のC++コンパイラの問題

QStringList lst2 = instantiatedTableInstances.split(strComma, skipper); 

    for(int i=0; i<lst2.size(); i++) 
    { 
     TableInstance* tabInst= v->getTableInstance(lst2.at(i)); 
     result->addInstantiatedTableInstance(tabInst); 
    } 

を、それは私に与える:

..\src\DeserializationFactory.cpp(1196) : error C2143: syntax error : missing ';' before 'constant' 
..\src\DeserializationFactory.cpp(1196) : error C2440: '=' : cannot convert from 'QStringList' to 'int' 
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
..\src\DeserializationFactory.cpp(1198) : error C2228: left of '.size' must have class/struct/union 
    type is 'int' 
..\src\DeserializationFactory.cpp(1200) : error C2228: left of '.at' must have class/struct/union 
    type is 'int' 

とスクリーンショット:

VS2010 error

しかし私が代わりにlst2すべてがコンパイルのlstに変数の名前を変更する場合は...

が、これはVisual Studioの2010年には面白いバグです(GCCがそれを気にしていないため)、またはこのためのより多くの隠された理由があるのでしょうか?

+0

スコープ内でlst2が定義済み/宣言済み/マクロでないことを確認してください。 – user2672165

+1

lst2はマクロです。スクリーンショットから色が違っているように見えます。 – relaxxx

+1

ヒント: 'WIN32_LEAN_AND_MEAN'を定義することで修正されました。 – MSalters

答えて

12

これらの種類のエラーは、通常、変数名と同じ名前の予期しないマクロが原因です。

#define lst2  0x0461 

私は名汚染呼んだ:グーグルのビットは、Windows SDKヘッダーDlgs.hにあなたにこの行を見つけます!

私の推測では、MSの人々は、各ダイアログのコントロールのために異なるIDを使用して維持することは困難どのようなことを考えて、ということであるので、同じIDのダイアログいかなるのリストを与えるけれども:lst1lst2lst3を。 .. lst16。他のコントロールと同じです。しかし、なんらかの理由でアイデアがキャッチせず、Dlgs.hヘッダーが忘れられました。

今、奇妙なことは、このヘッダーがVC++プロジェクトにデフォルトで組み込まれていて、GCCコンパイルには含まれていないということです。多分、環境は同じではないでしょう。

+0

あなたはそれに私を打つ; +1を持つ。 *マクロに何が間違っているかの例を挙げてください。 – Angew

+2

@Angew:誰もがマクロが悪いことを知っています。しかし、 'WIN32_DLG_DEFAULT_LIST_2'という名前の場所に誰も気にしないなら。 'lst2'をマクロ名として使うのは邪悪で馬鹿です。 – rodrigo

+0

' 'のプリプロセッサ定義が使用中です。それらは共通のダイアログ(Open File Dialogのような)で使用されるコントロールIDの記号定数です。共通ダイアログをカスタマイズする場合は、それらのIDが必要です([Explorer-Style Hook Procedures](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646960.aspx#_win32_Explorer_Style_Hook_Procedures)を参照)) 。さらに、すべてのダイアログ内のすべてのコントロールに異なるIDを割り当てることは、実際には不可能です。制御IDは16ビットに制限されています。 – IInspectable

0

は、すでにintの型を持つlstという変数があるようです。 はい、私はコンパイラのバグのように見えることに同意します。なぜなら、if(secondStep){}がラップされた新しい変数空間にいるからです。

関連する問題