gpt4 book ai didi

c++ - 函数模板参数的顺序

转载 作者:搜寻专家 更新时间:2023-10-31 00:46:05 25 4
gpt4 key购买 nike

在以下 2 个模板参数中的代码中,我隐式使用了其中一个,显式使用了另一个:

class A {};

template<typename ToType, typename FromType>
ToType CompileTimeCast (FromType pointer)
{
return (ToType)(pointer);
}

int main ()
{
A *pA;
int *pi = CompileTimeCast<int*>(pA); // function invocation
}

它工作正常。现在,如果我在参数列表中交换 ToTypeFromType,编译器会抛出错误:

 error: no matching function for call to ‘CompileTimeCast(A*&)’

很想知道为什么编译器在知道函数调用时两个参数不同并且一个参数已被使用时会报错?

最佳答案

当你显式指定模板参数时,你必须按顺序指定它们,就像你必须以正确的顺序指定函数参数一样,即使它们是默认的:

int *pi = CompileTimeCast<int*, const int*>(pA);

在这个例子中,假设你的原始代码,ToTypeint*FromTypeconst int*。如果您只显式指定模板参数的一个子集,编译器将强制假定您的子集是按顺序排列的前几个模板参数。并且所有尾随模板参数必须是可推导的。

请注意,对于编译器推导的模板参数集,顺序无关紧要。在您的示例中, FromType 是可推导的。

您已经发现了对模板参数进行排序的正确理由:通过降低客户希望在您的函数调用中明确指定它们的可能性来对它们进行排序。

关于c++ - 函数模板参数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605076/

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