这些替代方案([temp.deduct.call]/4)只有在类型扣减失败时才会考虑。如果产生多个可能推导的A,则类型推导失败。注意:如果在函数模板的任何函数参数中没有使用模板参数,或者仅在非推导的上下文中使用,则不能从函数调用中推导出相应的模板参数,而且必须显式指定模板参数。-尾注
我的问题:
请用一个触发这种情况的例子来支持这个答案。
发布于 2022-08-15 12:48:00
template<typename>
struct B {};
struct D : B<int>, B<double> {};
template<typename T>
void f(B<T>);
int main()
{
f(D{});
}如果
P是一个类,而P具有简单模板id的形式,则转换后的A可以是导出A的派生类D。
适用于此,并且可以推导出两个A:B<int>或B<double>。所以类型推断失败了。
额外的例子:与过载解决方案的交互:
template<typename>
struct A {};
template<typename>
struct B {};
struct D1 : A<int>, B<int> {};
struct D2 : A<int>, B<int>, B<double> {};
template<typename T>
void f(A<T>); // 1
template<typename T>
void f(B<T>); // 2
int main()
{
f(D1{}); // error, ambiguous between 1 and 2
f(D2{}); // calls specialization of 1, because deduction for 2 fails
}发布于 2022-08-13 08:53:12
这些替代的演绎如何能够产生多个可能的“推导A"?,请用一个触发这个案例的例子来支持这个答案。
这方面的一个例子是:
template<typename T>
void f(T a, T b)
{
}
int main()
{
f(3, 5.5); //deduced A as int from first deduction while double from second deduction
return 0;
}这里我们有多个可能的“推导A”。从第一个参数,我们有int,从第二个参数,b,我们有double。
https://stackoverflow.com/questions/73342779
复制相似问题