我有一个模板类和一个朋友operator*函数
StereoSmp<TE> operator* (const StereoSmp<TE>& a, TE b)
Run Code Online (Sandbox Code Playgroud)
我使用它TE=float但我需要增加一个StereoSmp<float> * double
我认为应该是可能的因为它应该自动转换double为float有效但我得到错误:
Run Code Online (Sandbox Code Playgroud)no match for ‘operator*’ (operand types are ‘StereoSmp<float>’ and ‘__gnu_cxx::__alloc_traits<std::allocator<double> >::value_type {aka double}’) deduced conflicting types for parameter ‘TE’ (‘float’ and ‘double’)
为什么它不会自动将double转换为float?我该怎么做才能允许类型之间的自动转换?
不要让你的朋友成为模板.
template<class TE>
struct StereoSmp {
friend StereoSmp operator* (const StereoSmp& a, TE b) {
return multiply( a, b ); // implement here
}
};
Run Code Online (Sandbox Code Playgroud)
这是模板的每个类型实例的非模板朋友StereoSmp.它会考虑转换.
模板函数不考虑转换,它们只是进行精确的模式匹配.在C++中,重载分辨率已经足够疯狂了.