【问题标题】:function template with unused template parameter具有未使用模板参数的函数模板
【发布时间】:2018-06-15 10:21:12
【问题描述】:
template<typename T>
struct a 
{ 
  using type = int;
  typename T::type i;
};

template<typename T, typename = a<T>>
void f1(T) {}

template<typename T, typename = typename a<T>::type>
void f2(T) {}

int main()
{
  f1<int>(1); // ok
  f2<int>(1); // error

  return 0;
}

a&lt;int&gt; 的实例化应该是一个错误,因为int::type 是非法的。但似乎f1&lt;int&gt; 不能导致a&lt;T&gt; 的实例化,但f2&lt;int&gt; 可以。是什么原因?

【问题讨论】:

    标签: c++ templates instantiation implicit-instantiation


    【解决方案1】:

    当 type 用作template argument(包括默认模板参数)时,不需要是完整类型。

    类型模板形参的模板实参必须是 type-id,它可能命名不完整的类型:

    所以对于f1,默认模板参数是a&lt;T&gt;,它不必是完整的。给定f1&lt;int&gt;(1); a&lt;int&gt; 不需要实例化。

    但是当你引用类模板的成员时,作为f2的默认模板参数typename a&lt;T&gt;::typea&lt;T&gt;必须是完整类型,然后导致implicit instantiation

    当代码在上下文中引用需要完全定义类型的模板时,或者当类型的完整性影响代码时,并且该特定类型尚未显式实例化,就会发生隐式实例化。例如,当构造此类型的对象时,而不是构造指向此类型的指针时。

    这适用于类模板的成员:除非该成员在程序中被使用,否则它不会被实例化,并且不需要定义。

    所以给定f2&lt;int&gt;(1);a&lt;int&gt;会被实例化然后导致编译错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多