请考虑以下内容:
template<typename X>
struct Z {};
struct A
{
using Z = ::Z<int>;
struct B : Z
{
using C = Z;
};
};
这个编译没有问题。很好。但现在在Z
中添加另一个参数:
template<typename X, typename Y>
struct Z {};
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>; // error: too few template arguments for class template 'Z'
};
};
好的,也许在派生嵌套类B
时,在类A
中定义模板别名Z
是可见的,但不在其内部,因为全局定义的Z
有两个参数,这会触发错误。
但是,当Z
只是A
中的类型别名时,为什么行为不同呢?
最后,将A
变为一个模板:
template<typename X, typename Y>
struct Z {};
template<typename T>
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>;
};
};
现在错误已经消失了。 为什么?
(在Clang 3.6和GCC 4.9.2上测试过)
A
不再是一个模板时出现的,我原以为这会简化代码。然而,我现在被迫为两个Z
使用两个不同的名称,这只会让代码更丑陋。如果有任何更好的解决方法,请告诉我。 - iavrusing C = Z;
怎么样?(对于模板参数A
不起作用) - Columbo未知类型名 'Z'
)。我得检查一下差异出在哪里。A
不再是一个模板,而且我打算保持这样。 - iavrZ
重命名了(比如改成了Z1
)。现在它正常工作了,并且真的简化了,因为我根本不需要using C ...
。太棒了,再次感谢! - iavr