我有一个模板类,可以将增益应用于矢量。模板必须处理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'
我该如何解决这个问题?
答案 0 :(得分:1)
1.0
和2.0
是double
类型的文字,而g
也是double
。
如果要禁止编译器警告,请使用
1.f
文字, 2.f
和float
。 float
的{{1}}类型。
在模板中使用g
而不是double
。
这些天,我很满意(2)在现代芯片组上可能会更快。如果您可以更改float
,那么您可以写
Star
并使用T g = static_cast<T>(2); // Gain
而不是std::size_t
作为unsigned
的类型,或者用于真正的迂腐:i
。