如何修复复杂类型的乘法和强制转换?

时间:2018-04-24 11:05:28

标签: c++

我有一个模板类,可以将增益应用于矢量。模板必须处理int,float和complex float类型。这是我的MWE:

#include <vector>
#include <complex>

template<class T> class Star
{
public:
    void applyGain(std::vector<T> &data)
    {
        double g =  2.0;  // Gain

        for (unsigned i=0; i<data.size(); i++)
        {
            data[i] *= g;
        }
    }
};

Star<float> floatStar;
Star<std::complex<float>> complexStar;

int main()
{
    std::vector<float> floatVec = { 1.0, 2.0 };
    std::vector<std::complex<float>> complexFloatVec = { (1.0f,-1.0f) };

    floatStar.applyGain(floatVec);
    complexStar.applyGain(complexFloatVec);

    return 0;
}

代码构建得很好,但是,它给出了编译器警告:

warning C4244: '*=': conversion from 'double' to 'float', possible loss of data

对于浮动情况,可以通过将for循环更改为:

来轻松修复
for (unsigned i=0; i<data.size(); i++)
{
    data[i] = static_cast<T>(g * data[i]);
}

然而,复杂的情况失败了:

error C2784: 'std::complex<_Other> std::operator *(const std::complex<_Other> &,const _Ty &)': could not deduce template argument for 'const std::complex<_Other> &' from 'double'

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

1.02.0double类型的文字,而g也是double

如果要禁止编译器警告,请使用

    对于1.f文字,
  1. 2.ffloatfloat的{​​{1}}类型。

  2. 在模板中使用g而不是double

  3. 这些天,我很满意(2)在现代芯片组上可能会更快。如果您可以更改float,那么您可以写

    Star

    并使用T g = static_cast<T>(2); // Gain 而不是std::size_t作为unsigned的类型,或者用于真正的迂腐:i