Template 模板参数:以下示例中应用了什么规则
Template Template Parameters: What rule is applied in the following example
假设下面的例子
using namespace std;
template <template <typename> class>
struct X
{
X()
{
std::cout << "1";
}
};
template <typename>
struct Y {};
template <typename T>
using Z = Y<T>;
template <>
struct X<Y>
{
X()
{
std::cout << "2";
}
};
int main()
{
X<Y> x1;
X<Z> x2;
}
表达式X<Y> x1
很明显是使用了打印“2”的特化
第二个很奇怪。做分析 X<Z>
被翻译成 X< Y < T > >
。我希望打印 "1" 。但是 运行 代码打印“2”。第二个应用了哪个规则?
The second one is strange. Doing analysis the X<Z>
is translated to X< Y < T > >
. I expect to print "1" . But running the code this prints "2".
没有
您已经将 Z<T>
定义为 Y<T>
,因此 Y
和 Z
是同一回事。
并且 X<Z>
被翻译成 X<Y<T>>
是不正确的(并且 X<Y<T>>
无法匹配,因为 Y<T>
是 X
的类型仅接受模板模板参数)。
假设下面的例子
using namespace std;
template <template <typename> class>
struct X
{
X()
{
std::cout << "1";
}
};
template <typename>
struct Y {};
template <typename T>
using Z = Y<T>;
template <>
struct X<Y>
{
X()
{
std::cout << "2";
}
};
int main()
{
X<Y> x1;
X<Z> x2;
}
表达式X<Y> x1
很明显是使用了打印“2”的特化
第二个很奇怪。做分析 X<Z>
被翻译成 X< Y < T > >
。我希望打印 "1" 。但是 运行 代码打印“2”。第二个应用了哪个规则?
The second one is strange. Doing analysis the
X<Z>
is translated toX< Y < T > >
. I expect to print "1" . But running the code this prints "2".
没有
您已经将 Z<T>
定义为 Y<T>
,因此 Y
和 Z
是同一回事。
并且 X<Z>
被翻译成 X<Y<T>>
是不正确的(并且 X<Y<T>>
无法匹配,因为 Y<T>
是 X
的类型仅接受模板模板参数)。