gpt4 book ai didi

C++11 别名模板作为特化中的模板模板参数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:40 26 4
gpt4 key购买 nike

为什么下面的 C++11 程序不能编译?

template<template<typename> class X, typename Y> struct C;
template<template<typename> class X, typename Z> struct C<X, X<Z>> {};

template<typename T> using A = T*;

int main()
{
C<A, A<int>> c;
}

错误是:

aggregate ‘C<A, int*> c’ has incomplete type and cannot be defined

为什么 C 的偏特化没有匹配C<A, A<int>> ?

最佳答案

认为 14.5.7 别名模板:

When a template-id refers to the specialization of an alias template, it is equivalent to the associated type obtained by substitution of its template-arguments for the template-parameters in the type-id of the alias template.

会适用,所以 X<Z>将被解释为 Z*尽快X已知是别名模板。部分特化的语法确实使用了 template-id 语法规则。然而,模板参数替换发生在模板参数推导的最后一步,只有在所有模板参数都被推导后。

14.5.5.1 Matching of class template partial specializations [temp.class.spec.match]

2 A partial specialization matches a given actual template argument list if the template arguments of the partial specialization can be deduced from the actual template argument list (14.8.2).

14.8.2 Template argument deduction [temp.deduct]

5 When all template arguments have been deduced or obtained from default template arguments, all uses of template parameters in the template parameter list of the template and the function type are replaced with the corresponding deduced or default argument values.

没有 X 的模板参数替换, Z无法推断。所以,特化不匹配。

关于C++11 别名模板作为特化中的模板模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22281205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com