これは clang の問題のように見えます (私は既にclang にバグをオープンしました) が、間違いを犯していないことを確認したいと思います。
次のコードを検討してください。
struct B { };
template<typename...>
struct D;
template<typename T, typename U, typename... A>
struct D<T, U, A...>: D<U, A...> {
using C = D<U, A...>; // (1)
// using D<U, A...>::D; // (2)
// using C::C; // (3)
using C::D; // (4)
};
template<typename T>
struct D<T>: T { using T::T; };
int main() {
D<int, double, B> d{};
}
行 (2) ((1) と (4) がコメント化されている場合) および (3) ((4) がコメント化されている場合) は期待どおりに動作しますが、(1) (上記の例をそのまま) を実行すると、次のエラーが発生します。
11 : エラー:
C::D を使用して 'typename' のない型に解決された依存型 using 宣言。[...]
11 : エラー: using 宣言が 'C::' を参照していますが、これは
C::D を使用する 'D' の基本クラスではありません。
とにかく、C
は のエイリアスでありD<U, A...>
、 の基底クラスですD<T, U, A...>
。
私の知る限り、そのスニペットはコンパイルされるはずです。私が間違っている?