【问题标题】:Template Template Parameters: What rule is applied in the following example [duplicate]模板模板参数:以下示例中应用了什么规则[重复]
【发布时间】:2019-01-29 04:21:14
【问题描述】:

假设下面的例子

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&lt;Y&gt; x1显然是使用打印“2”的特化

第二个很奇怪。做分析X&lt;Z&gt;被翻译成X&lt; Y &lt; T &gt; &gt;。我希望打印 "1" 。但是运行代码会打印“2”。第二条应用了哪条规则?

【问题讨论】:

  • 如果它被翻译成X&lt; Y &lt; T &gt; &gt;,你会得到一个错误,因为T是未定义的(另一个错误是因为Y&lt;T&gt;不是模板(X要求),这是一门课)。

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


【解决方案1】:

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

没有。

你有 Z&lt;T&gt; 被定义为 Y&lt;T&gt; 所以 YZ 是同一个东西。

X&lt;Z&gt; 被转换为X&lt;Y&lt;T&gt;&gt; 是不正确的(并且X&lt;Y&lt;T&gt;&gt; 不能匹配,因为Y&lt;T&gt;X 只接受模板模板参数的类型)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多