1

私はVS2005とSTLのMS実装を使用しています。ただし、のクラスtype_infoは、「namespacestd」の外部で宣言されています。これにより、std :: type_infoを見つけることを除いて、サードパーティのライブラリにいくつかの問題が発生します。なぜそうなのですか、そして回避策はありますか?typeinfoの最初からのサンプルを次に示します。

class type_info {
...
};


_STD_BEGIN // = namespace std  {
4

3 に答える 3

3

それは興味深いです-標準はそれを言います(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_infostdtypeid

しかし、「なぜ」に対する本当の答えは、Microsoft(またはPJ Plauger / Dinkumware)の誰かに尋ねる必要があると思います。

于 2009-11-06T14:59:51.513 に答える
1

using宣言には、実際にはありstd::type_infoます。内部で定義されていないことが問題になるシナリオもあるかもstdしれませんが、そのうちの1つに遭遇したのではないかと思います。

あなたの問題は何ですか?

于 2009-11-06T14:18:26.020 に答える
0

Visual Studioは、レガシーコードが機能できるようにするために、あらゆる種類のトリックを実行するためです。IIRC、標準は名前空間type_info内に存在するものだけを述べています。stdグローバル名前空間内に存在しないことを義務付けているわけではありません。これは実際には実装上の決定です。

警告エンプター:私はこれをスタンダードで検証していません。

于 2009-11-06T14:23:33.187 に答える