关于函数模版具体化传递参数的有关问题

关于函数模版具体化传递参数的问题
#include <iostream>

struct box
{
int height;
int width;
int length;
int volume;
};
template <class T1, class T2>
T2 maxvol(T1 &, T1 &);

template <> int maxvol(box &, box &);

int main()
{
box b1 = {1, 2, 3, 0};
box b2 = {4, 5, 6, 0};
std::cout << "最大体积是: " << maxvol(b1, b2) << std::endl; 

return 0;
}

template <> int maxvol(box &b1, box &b2)
{
b1.volume = b1.height * b1.width * b1.length;
b2.volume = b2.height * b2.width * b2.length;
return (b1.volume > b2.volume ? b1.volume : b2.volume); 
}



编译器提示错误: 
no matching function for call to 'maxvol(box&, box&)' 
对‘maxvol(box&, box&)’的调用没有匹配的函数


如果我修改一下, 把
 
template <class T1, class T2>
T2 maxvol(T1 &, T1 &);
template <> int maxvol(box &, box &);

改成

template <class T>
T maxvol(T &);
template <> box maxvol(box &, box &);

之后, 再把程序稍微修改一下就可以编译了,

我问了下别人, 别人只是回答 "返回值不能用于决定函数原型",  有没有更加详细的解释? 
------解决方案--------------------
调用模板函数时,可以显式地指定模板类型实参,也可以让编译器根据函数实参类型推导。

当你调用maxvol(b1, b2)时,编译器可以根据b1和b2的类型推出:模板参数T1是box,但是模板参数T2未知(不能推出它是int),所以模板不能实例化,调用出错。

因为模板参数T2不能根据函数实参推导出来,所以必须显式地指定:maxvol<box, int>(b1, b2) 

std::cout << "最大体积是: " << maxvol<box, int>(b1, b2) << std::endl; 


这样就可以了