C++ 何时需要指定类型a模板

C++ 何时需要指定类型a模板,c++,templates,function-templates,C++,Templates,Function Templates,我编写了一个简单的模板来查找参数列表中的最小值 template<typename T> T smallerList(T a, T b) { std::cout << "a= " << a << " b= " << b << std::endl; return a < b ? a : b; } template<typename T, typename... Rest> T smaller

我编写了一个简单的模板来查找参数列表中的最小值

template<typename T>
T smallerList(T a, T b) {
    std::cout << "a= " << a << " b= " << b << std::endl;
    return a < b ? a : b;
}

template<typename T, typename... Rest>
T smallerList(const T& param0, const Rest&... rest) {
    T temp =  smallerList(rest...);
    return param0 < temp ? param0 : temp;
}

int main()
{
       // Works, returns "3"
       std::cout << "Smaller: " << smallerList(4, 5, 6, 3, 7) << std::endl;

       // Sort of works, returns "2". Should be "2.14".
       std::cout << "Smaller: " << smallerList(3.14, 43534, 100.2, 3.13, 2.14) << std::endl; 

}
进入

T temp=smallerList(其余…);
此更改后,函数将按预期打印2.14


我的问题:为什么我需要指定类型?我认为模板函数是为每个被调用的类型“创建”的?

好的,我不知道如何真正帮助您,因为我不知道您想要什么样的确切逻辑。但在变量模板中,允许类型混合,在第二个向量中,传递一个整数-
43534
,因此当递归回滚时,当
2.14
反向传播时,得到如下结果

return(int)(43534<2.14?43534:2.14)

因为
43534
将是
param0
,并且您采用
param0
的返回类型,
2.14
将转换为
2
。接下来,它被转换回一个
浮点数
,但您看不到它

您需要检查参数的类型是否相同,或者提出一些逻辑来提升参数。如果您使用
43534.0
,它并不是像您期望的那样工作,因为它不再是
int

编辑:

T temp=smallerList(其余…)这并不能真正帮助您,它会改变行为,强制每个参数转换为第一个参数的类型。嗯,它变得更加一致。但是试试看:

smallerList(7, 10.5, 10, 3.13, 2.14)
它会坏的。我不能100%确定原因,但我猜它不能匹配递归的结尾,因为它将查找
smallerList(int,float)
,而您的终止符模板将不匹配

您将需要以下内容:

template<typename T, typename U>
T smallerList(T a, U b) {
    std::cout << "a= " << a << " b= " << b << std::endl;
    return a < b ? a : b;
}
模板
T小列表(T a,U b){

std::cout Ok,
smallerList(3.1443534100.2,3.13,2.14)的返回类型应该是什么
为什么?你能想出一个标准吗?啊,当然。我没有注意到double列表中的unsigned。我本来希望variadic模板有一个单一类型,但是列表中的每个值都会实例化一个新的smallerList函数。该类型不会传播。是的,你必须更改终止符模板的定义ate处理混合类型,因为如果第一个参数的类型与最后一个参数的类型不同,则当前版本将不匹配。
auto
来自c++14,或者
std::common_type
可能会有所帮助。
smallerList(7, 10.5, 10, 3.13, 2.14)
template<typename T, typename U>
T smallerList(T a, U b) {
    std::cout << "a= " << a << " b= " << b << std::endl;
    return a < b ? a : b;
}