2011-08-11 11 views
19

注入されたクラス名について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

+1。良い質問 – Nawaz

+0

2番目の節はあなたの例で 'X'を参照していませんか?私。 *注入クラス名*は 'ベクトル'ではなく 'X'ではありませんか?私はそれが当てはまると思います。引用符はコードには関係ありませんが、そのコンパイラの動作は正しいとは思われません。どちらかといえば 'std :: vector 'ベクトル 'であり、これはあいまい性エラーが引き起こされるべきであることを意味する。 –

+1

@David:クラス 'X'ではありますが、' vector'は両方の基底に公開名として挿入されています...したがって、最初の例のように 'X'の内部でも見える(あいまいである)べきです –

答えて

15

私はそれを見つけました!それは標準のすぐそこです!私が正しかった!それははあいまいなはずです!それ以上 いずれかで見つかった場合

項14.6.1項

注入クラス名(10.2)を求めるルックアップは、(例えば、特定のケースで 曖昧さをもたらすことができますベースクラス)。 にある注入されたクラス名がすべて同じクラステンプレートの特殊化を参照していて、 の後にtemplate-argument-listが続く場合、その参照は特殊化ではなく クラステンプレートを参照しますそれは であいまいではありません。[例:

template <class T> struct Base { }; 
template <class T> struct Derived: Base<int>, Base<char> 
{ 
    typename Derived::Base b; // error: ambiguous typename 
    Derived::Base<double> d; // OK 
}; 

末端例]

ボトムライン:これはまた別の、Microsoftのコンパイラのバグです。言語拡張機能を無効にしても効果はありません。

4

いいえ、あなたは何も欠けていない、あなたのコンパイラはバグがふるまうようだ。あなたはgccがここでそれをどのように処理するかを見ることができます:http://ideone.com/MI9gz

そのエラーメッセージは次のとおりです。

prog.cpp:4:4: error: reference to 'vector' is ambiguous 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error: candidates are: class std::vector<char> std::vector<char>::vector 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error:     class std::vector<int> std::vector<int>::vector 
+0

ああ、はい、確かに!私はちょうど標準からの引用を見つけました(私の答えを見てください) –