考虑以下模板来存储简化的 SI 单位:
template < int Mass, int Length, int Time >
class TUnit
{
public:
// Used type.
typedef float DataType;
.....
}
例如 SI 单位“长度”定义如下:
typedef TUnit< 0, 1, 0 > Length;
存在一个将 DataTypes 转换为 TUnits 的全局通用函数:
template < int Mass, int Length, int Time >
TUnit< Mass, Length, Time > convert( const typename TUnit< Mass, Length, Time >::DataType& src );
我们有一个专门的版本来将浮点数转换为长度,例如从 [km] 到 [m] 的隐式转换:
template < >
Tools::DataTypes::Length convert( const Tools::DataTypes::Length::DataType& src );
现在尝试将浮点数转换为长度:
float f = 1.0;
Length l = ::convert( f )
现在 VC2012 无法编译并出现错误代码:
error C2783: could not deduce template argument for 'Mass'
could not deduce template argument for 'Length'
could not deduce template argument for 'Time'
为了解决这个问题,我将代码更改为:
float f = 1.0;
Length l = ::convert< 0, 1, 0 >( f )
很好,但这不是我想要的:) 我首选的语法是:
float f = 1.0;
Length l = ::convert< Length >( f )
我想我必须将通用模板函数的签名更改为:
template < TUnit< int Mass, int Length, int Time > >
TUnit< Mass, Length, Time > convert( const typename TUnit< Mass, Length, Time >::DataType& src );
但是,这种语法当然是错误的。有什么提示可以解决这个问题吗?