模板模板参数:在以下示例中应用了什么规则

时间:2018-08-22 20:39:27

标签: c++ c++11 templates template-templates using-declaration

假设以下示例

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

1 个答案:

答案 0 :(得分:0)

  

第二个很奇怪。进行分析,将X<Z>转换为X< Y < T > >。我希望打印“ 1”。但是运行代码会显示“ 2”。

否。

您将Z<T>定义为Y<T>,因此YZ是同一件事。

X<Z>转换为X<Y<T>>并不正确(并且X<Y<T>>不匹配,因为Y<T>X只接受的类型模板模板参数)。