基本クラスを参照するときに必要な名前空間です
-
28-09-2019 - |
質問
私はこのようなコードを持っています:
namespace N {
class B {
public:
virtual void doStuff(B *) = 0;
};
}
// not in a namespace
class Derived : public N::B {
public:
void doStuff(B *); // Should this be N::B, or is B ok?
};
派生が基本クラスを指す名前空間予選が必要ですか? GCCとMSVCは書かれたコードに満足していますが、名前空間を入れない限り、別のコンパイラが文句を言います。C++標準は何と言っていますか?
解決
クラスの定義Bは問題ありません。それはいわゆるものです 注入クラス名.
これは、テンプレートを指します(従属ベースをカウントしません)。例えば
template <class T> class B{};
template <class T> class C: public B<int>
{
void f(B* p) {} //same as B<int>* p
void f(C* p) {} //same as C<T>* p
};
一般に、基本クラス(およびクラス自体)は、資格またはテンプレートの引数なしでクラスの定義内で参照できます。
標準からの引用:
9.2:クラス名が見られた直後に宣言されるスコープにクラス名が挿入されます。クラス名もクラス自体の範囲に挿入されます。これは、注入クラス名として知られています。アクセスチェックの目的のために、注入されたクラス名は公開メンバー名のように扱われます。
この定義から、クラス自体の名前はクラスから公開されているため、派生クラスで入手できます。名前が継承されているため、bがn :: bと一緒に大丈夫であることについての私のポイントが証明されています
ところで、これは、以下が無効である理由も説明しています。
template <class T> class B{};
template <class T> class C: public B<T>
{
void f(B* p){} //ERROR
// the above is invalid!! Base class is dependent therefore
//its scope is not considered during unqualified name lookup
void g(typename C::B* p){} //this is valid, same as B<T>* p
};
14.6.1は、テンプレートで注入されたクラス名について話します。ここで貼り付けるには長すぎます。 Hth
所属していません StackOverflow