このコードは有効な C++(11) ですか?
struct Base {
template <typename>
struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };
typedef Derived3::nested<int> xxx;
私が知っていること
上記のコードは、次の場合にコンパイルに失敗します:
- Apple LLVM 5.0 (clang-500.2.75)
- クラン 3.4
しかし、それは正常にコンパイルされます:
- gcc 4.9.0 20131110 (実験的)
- gcc 4.8
また、nested
型を非テンプレート型に変更すると、つまり
struct Base {
struct nested;
};
...
typedef Derived3::nested xxx;
その後、上記のコンパイラで動作します。
[編集]nested
テンプレート構造体をテンプレート エイリアスに変更しても何も変わりません
。
template <typename> struct dependent { struct type; };
struct Base {
template <typename T>
using nested = typename dependent<T>::type;
};
上記のコンパイラで同じ結果が得られます。 [編集終了]
N3242 §10.1 [class.mi] より
クラスは、複数回間接基本クラスになることができ、直接および間接基本クラスになることができます。このようなクラスでできることは限られています。直接基底クラスの非静的データ メンバーおよびメンバー関数は、派生クラスのスコープ内で参照できません。ただし、静的メンバー、列挙型、および型は明確に参照できます。
コードが有効であることを意味すると思いますが、よくわかりません。