注入されたクラス名についてC++標準で読んだのは、私が直面するサンプルプログラムの動作と矛盾します。ここに私が読んだものです:3.4からあいまいな注入クラス名がエラーではありません
(パラグラフ3)
クラス(項9)の注入されたクラス名ものためにそのクラスの メンバーであると考えられています名前の隠蔽と検索の目的。
9から(第2項)
クラス名、クラス名を見た直後に、それが 宣言されたスコープ内に挿入されます。クラス名も で、クラス自体のスコープに挿入されています。これは 注射クラス名として知られています。アクセスチェックの目的のために、 注射クラス名は、パブリックメンバー名であるかのように扱われます。これらのことから
私は次は整形式変換ユニットであり、それは正常にコンパイルすることを理解しています。
#include <vector>
class X: std::vector<int>
{
vector mem;
};
しかし、私は次のエラーが発生しているべきであると仮定しますが、名前vector
がpublicメンバーかのようにようstd::vector<int>
とstd::vector<char>
の両方に注入されているので、それは
#include <vector>
class X: std::vector<int>, std::vector<char>
{
vector mem; //compiles OK... mem is apparently std::vector<int>
};
をしませんXで継承する必要があります。したがっての名前はX
であいまいです。何か不足していますか?
P.S.私はMSVC9.0を使用しています
+1。良い質問 – Nawaz
2番目の節はあなたの例で 'X'を参照していませんか?私。 *注入クラス名*は 'ベクトル'ではなく 'X'ではありませんか?私はそれが当てはまると思います。引用符はコードには関係ありませんが、そのコンパイラの動作は正しいとは思われません。どちらかといえば 'std :: vector'ベクトル 'であり、これはあいまい性エラーが引き起こされるべきであることを意味する。 –
@David:クラス 'X'ではありますが、' vector'は両方の基底に公開名として挿入されています...したがって、最初の例のように 'X'の内部でも見える(あいまいである)べきです –