0

設定

#include<utility> // I actually use precompiled headers 
#include<map>
...SOME CODE...
namespace{
... SOME CODE...
/*Line 278*/ std::map<std::pair<int,int>,SmartPointer<A>> myMap;
/*Line 279*/ myMap.at(std::make_pair(1,1));
}

SmartPointer は、自動ヒープ メモリ管理のために他のクラスをスマート ポインターでラップするクラスです。

これをコンパイルしようとすると、大量のエラーが発生します。

cpp(279): error C2143: syntax error : missing ';' before '.'
cpp(279): error C4430: missing type specifier - int assumed. Note: C++ does not 
support default-int
cpp(279): error C2371: '`anonymous-namespace'::map' : 
redefinition; different basic types
cpp(278) : see declaration of '`anonymous-namespace'::map'

278 行目と 279 行目は上記のコード行です。

ご覧のとおり、マップは匿名名前空間にあります。これは、非標準型を値として受け入れるようにマップが内部的に構成されていないためだと思われます。

これはすべてVS 2010で発生しています+私はC++ 11も使用しています。

質問

これらのコンパイル エラーが発生する理由とその修正方法を教えてください。

進捗

これ>>は問題ではありません - 2行目をコメントアウトすると、ファイルは文句を言わずにコンパイルされます( と の両方>>) > >

コードをこれに減らしました-エラーの原因を確認するために-次の一連のコンパイルエラーが発生します。

コード:

std::map < int, int > myMap;
myMap[3] = 4;

エラー:

cpp(279): error C4430: missing type specifier - int assumed. Note: C++ does not 
support default-int
cpp(279): error C2373: 'myMap' : redefinition; different type modifiers
cpp(278) : see declaration of 'myMap'
cpp(279): error C2440: 'initializing' : cannot convert from 'int' to 'int [3]'
There are no conversions to array types, although there are conversions 
to references or pointers to arrays

答え

@ケーシー

Casey が提案したようにmyMap.at(..)、名前空間のスコープに入れることはできません。関数のスコープに入れたら修正されました。

4

2 に答える 2

0

名前が衝突しています:

std::map<std::pair<int,int>,SmartPointer<A>> map;

名前mapはタイプです。型名を変数名として使用することはできません。何かのようなもの

std::map<std::pair<int,int>,SmartPointer<A>> myMapThatHasAUsefullName;

それを修正する必要があります。

于 2013-07-29T14:27:40.743 に答える
0

map変数名などの標準ライブラリ名を再利用しないでください。意味のあるものと呼んでください。型と変数の間の競合も解消されます。

#include <utility>また、持ち込むのを忘れていましたstd::pair

于 2013-07-29T14:24:23.173 に答える