【问题标题】:with template constructor,template argument deduction/substitution failed,why?使用模板构造函数,模板参数推导/替换失败,为什么?
【发布时间】:2014-05-19 02:56:08
【问题描述】:

代码如下:

template<typename T>
struct ST{
ST();
ST(T t){}
};
template<typename T>
void fun(ST<T> t, T a){
}

int main(int argc, char * argv[])
{
  ST<int> t=2;
   fun(2,2);
}

用 g++ 4.8.2 编译 错误信息:

没有匹配到 fun(int,int)

候选人是:

模板无效乐趣(ST,T)

模板参数推导/替换失败:

“ST”和“int”类型不匹配

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    隐式类型转换不用于推导模板参数,在这种情况下您必须手动指定类型fun&lt;int&gt;(2,2);

    【讨论】:

    【解决方案2】:

    试试:

    template<class T>struct identity{typedef T type;};
    template<class T>void fun(typename identity<S<T>>::type s, T t)
    

    这将阻止编译器尝试对第一个参数进行参数类型推导。

    template 类型匹配是模式匹配。很少进行转换,因为在一般情况下它无法解决(是否有T 可以从Z 类型转换X&lt;T&gt; 是图灵完备的,直到template 编译器的任意限制:递归深度等)。

    在 C++11 中你可以这样做:

    template<class T>struct identity{typedef T type;};
    template<class T>suing identity_t = typename identity<T>::type;
    template<class T>void fun(identity_t<S<T>> s, T t)
    

    我觉得它更干净(将样板从其他代码中移开)。

    【讨论】:

      【解决方案3】:

      您的函数签名是void fun(ST&lt;T&gt; t, T a),但您使用fun(int, int) 调用该函数。就像你的错误说的那样,这些不匹配。如果fun 的类型推导为int,则签名将如下所示:fun(ST&lt;int&gt; t, int a),您可以使用fun(t, 2) 调用它。

      【讨论】:

      • 但是有一个构造函数,可以将 int 转换为 ST
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2018-04-28
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多