首页 > 解决方案 > 模板模板参数:以下示例中应用了什么规则

问题描述

假设以下示例

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”。哪条规则适用于第二条?

标签: c++c++11templatestemplate-templatesusing-declaration

解决方案


第二个很奇怪。做分析X<Z>被翻译成X< Y < T > >. 我希望打印 "1" 。但是运行代码会打印“2”。

不。

你有那个Z<T>被定义为Y<T>这样Y并且Z是同一件事。

并且不是真的X<Z>被翻译成X<Y<T>>(并且X<Y<T>>不能匹配,因为Y<T>它是一种X只接受模板模板参数的类型)。


推荐阅读