以下のテンプレートの関数を、

complex<double> c = u16todbm<complex<double> >(10, 32768.0, 0.0);

と呼ぶと問題なくコンパイルできますが、

complex<short> c = u16todbm<complex<short> >(10, 32768.0, 0.0);

に変更すると、*+を使用している行で、

error: no match for ‘operator*’
error: no match for ‘operator+’

が発生してコンパイルが出来ません。

・呼ばれる側

template<typename samp_type>
samp_type u16todbm(samp_type a, double add, double mul)
{
  // scale offset
  a = a * mul;
  a = a + add;

  return a;
}

・呼ぶ側

int main(int argc, char* args[])
{
  complex<short> c = u16todbm<complex<short> >(10, 32768.0, 0.0); // コンパイルエラー
  complex<double> c = u16todbm<complex<double> >(10, 32768.0, 0.0); // コンパイル通る
}

complexとdoubleの*や+が定義されていないのか?と思いますが、実装方法がわかりません。
お教え願えないでしょうか。