考虑以下几点:模板别名能见度嵌套类
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>;
};
};
现在错误消失。 为什么?
(测试锵3.6和GCC 4.9.2)
哇。这很清楚,谢谢。当'A'停止作为模板时,实际上出现了这个错误,我认为这会简化代码。然而,我现在被迫为两个'Z'使用两个不同的名字,这只会使代码更丑。如果有更好的解决方法,请告诉我。 – iavr
@iavr如何使用C = Z;'? (不适用于'A'作为模板) – Columbo
现在令人印象深刻:-)是的,它适用于此简化代码,但不适用于我的原始代码('未知类型名称'Z'')。我将不得不检查其中的差异。 'A'不再是一个模板,我打算保持这种模式。 – iavr