gpt4 book ai didi

c++ - 将显式实例化的函数模板与转换相匹配

转载 作者:行者123 更新时间:2023-12-02 07:35:30 27 4
gpt4 key购买 nike

考虑使用隐式构造函数的模板

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

以及这个函数模板

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

即使我显式实例化 func<T>()对于 T = int

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

调用func这样就无法编译

func(1);

错误:

no matching function call for 'func'

我知道模板参数推导不适用于转换,但在本例中我创建了 func 的显式实例化因此不需要推导,我希望转换能够像正常函数一样工作。

为什么不工作?

最佳答案

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

In order to instantiate a function template, every template argument must be known

但是

Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.

显式实例化不会改变任何内容;模板参数推导无法推导T ,那么就不会发生实例化(func<int>或其他)。

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

func<int>(1);

你可以为它编写一个包装器,例如

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

那么你就可以

bar(1);

关于c++ - 将显式实例化的函数模板与转换相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60017536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com