【问题标题】:Matching explicitly instantiated function template with conversion将显式实例化的函数模板与转换匹配
【发布时间】:2020-02-01 13:55:19
【问题描述】:

考虑这个带有隐式构造函数的模板

template<typename T>
struct X { X(T) { } };

还有这个函数模板

template<typename T>
void func(X<T>) { }

即使我为T = int 明确实例化func&lt;T&gt;()

template void func<int>(X<int>);

像这样对func 的调用无法编译

func(1);

错误:

'func' 没有匹配的函数调用

我知道模板参数推导不适用于转换,但在这种情况下,我创建了 func 的显式实例化,因此不需要推导,我希望转换可以像普通函数一样工作。

为什么不工作?

【问题讨论】:

    标签: c++ function templates overloading implicit-conversion


    【解决方案1】:

    问题给出func(1);template argument deduction无法推导出T(如int)。

    为了实例化一个函数模板,必须知道每个模板参数

    但是

    类型推导不考虑隐式转换(除了上面列出的类型调整):这是重载解析的工作,稍后会发生。

    显式实例化没有任何改变;模板参数推导不能推导出T,则不会发生(func&lt;int&gt; 或其他的)实例化。

    您可以显式指定模板参数以绕过模板参数推导。

    func<int>(1);
    

    你可以为它写一个包装器

    template<typename T>
    void bar(T t) {
        func<T>(t);
    }
    

    那么你可以

    bar(1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-15
      • 2011-06-23
      • 2014-02-26
      • 2011-10-07
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多