为什么在调用模板化函数时不考虑参数转换?

And*_*993 2 c++ templates

我有一个模板类和一个朋友operator*函数

StereoSmp<TE> operator* (const StereoSmp<TE>& a, TE b)
Run Code Online (Sandbox Code Playgroud)

我使用它TE=float但我需要增加一个StereoSmp<float> * double 我认为应该是可能的因为它应该自动转换doublefloat有效但我得到错误:

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’)
Run Code Online (Sandbox Code Playgroud)

为什么它不会自动将double转换为float?我该怎么做才能允许类型之间的自动转换?

Yak*_*ont 5

不要让你的朋友成为模板.

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++中,重载分辨率已经足够疯狂了.