这看起来像是 clang 中的一个问题(我已经打开了一个bug 到 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”的依赖使用声明;[...]
11:错误:使用声明引用'C::',它不是'D'的基类,
使用C::D;
无论如何,C
是 的别名D<U, A...>
,即 的基类D<T, U, A...>
。
据我所知,该片段应该编译。我错了吗?