私はVS2005とSTLのMS実装を使用しています。ただし、のクラスtype_infoは、「namespacestd」の外部で宣言されています。これにより、std :: type_infoを見つけることを除いて、サードパーティのライブラリにいくつかの問題が発生します。なぜそうなのですか、そして回避策はありますか?typeinfoの最初からのサンプルを次に示します。
class type_info {
...
};
_STD_BEGIN // = namespace std {
私はVS2005とSTLのMS実装を使用しています。ただし、のクラスtype_infoは、「namespacestd」の外部で宣言されています。これにより、std :: type_infoを見つけることを除いて、サードパーティのライブラリにいくつかの問題が発生します。なぜそうなのですか、そして回避策はありますか?typeinfoの最初からのサンプルを次に示します。
class type_info {
...
};
_STD_BEGIN // = namespace std {
それは興味深いです-標準はそれを言います(17.4.1.1。ライブラリの内容)
マクロ、演算子new、および演算子deleteを除くすべてのライブラリエンティティは、名前空間std内、または名前空間std内にネストされた名前空間内で定義されます。
そして、それを明確に言います(5.2.8タイプの識別)
typeid式の結果は、静的型const std :: type_info(18.5.1)および動的型const std ::type_infoまたはconstnameの左辺値です。ここで、nameは、std::type_infoから派生した実装定義のクラスです。 18.5.1で説明されている動作。
もちろん、ヘッダーの記述<typeinfo?>
は、それが名前空間にあるべきであることを示していますstd
(18.5タイプの識別):
ヘッダー
<typeinfo>
の概要namespace std { class type_info; class bad_cast; class bad_typeid; }
したがって、名前空間type_info
内にある必要がありstd
ます(名前空間の外ではありません)。std
これはバグであるか、名前空間の外部でそれを必要とするコードの大きなセット(または重要なコードの小さなセット)があると思います。std
必要に応じて名前空間に強制的に入れることができるように、プリプロセッサの魔法を使って作成すると思っていました(またはその逆-std
デフォルトで作成し、マクロなどで強制的にグローバル名前空間)。
ただし、もう1つの問題は、それが演算子type_info
の結果であるということですtypeid
(より正確には、派生したものが結果です)。したがって、ライブラリが一致している必要がtype_info
ある演算子に対してコンパイラが実行する内容に厳密に依存している可能性があります。したがって、名前空間にないtypeid
という事実は、コンパイラが式を処理するためである可能性があり、ライブラリの作成者はおそらくそれを直接制御することはほとんどできません(これが、問題のプリプロセッサの回避策がない理由の1つだと思います)。コンパイラがどのように機能するかについて私よりもよく知っている人は、これをよりよく説明する必要があります(または推測を超えて理解する必要があります)。type_info
std
typeid
しかし、「なぜ」に対する本当の答えは、Microsoft(またはPJ Plauger / Dinkumware)の誰かに尋ねる必要があると思います。
using
宣言には、実際にはがありstd::type_info
ます。内部で定義されていないことが問題になるシナリオもあるかもstd
しれませんが、そのうちの1つに遭遇したのではないかと思います。
あなたの問題は何ですか?
Visual Studioは、レガシーコードが機能できるようにするために、あらゆる種類のトリックを実行するためです。IIRC、標準は名前空間type_info
内に存在するものだけを述べています。std
グローバル名前空間内に存在しないことを義務付けているわけではありません。これは実際には実装上の決定です。
警告エンプター:私はこれをスタンダードで検証していません。