設定
#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(..)
、名前空間のスコープに入れることはできません。関数のスコープに入れたら修正されました。