出于教育目的,我正在使用自己的C ++数字向量模板类。我希望能够为两个向量的点积写(v,w),然后按如下方式重载operator,()
:
template<class T>
const T Vector<T>::operator,(const Vector<T>& v) const
{
assertEqualSize(v);
T t;
for(size_t i=0; i<numElements; i++) {
t += elements[i] * v[i];
}
return t;
}
我现在的问题是:如何正确初始化t
具有合理的价值(例如0.0
为Vector<double>
)?我试过T t();
但是然后g ++告诉我,例如,“double(*)()”在return语句中不能转换为“const double”,并且operator+=()
不会被定义为“({ double(),double)“。
非常感谢!
答案 0 :(得分:9)
您需要的是值初始化,它具有零初始化内置类型的效果:
T t{}; // C++11
T t = T(); // C++03 and C++11
这不起作用的原因
T t();
是它是一个名为t
的无参数函数的声明,返回T
。
答案 1 :(得分:0)
当简单值初始化调用默认构造函数任何类型T
,包括用户定义的类型>因此可能无法初始化。如果您打算使用内置类型T
之外的其他内容,我会感到惊讶,但您的代码的用户可能有其他想法...您应该防止这种情况,例如:通过SFINAE:
template<class T>
struct is_complex { static const bool value = false; };
template<class U>
struct is_complex<std::complex<U>> : std::is_floating_point<U> {};
template<class T>
typename
std::enable_if<std::is_floating_point<T>::value || is_complex<T>::value,
T>::type
T Vector<T>::operator,(const Vector<T>& v) const
{
T t{}; // value-initialisation is now guaranteed to be zero-initialisation
/* ... */
}
当然,这种类型的SFINAE可以作为一个整体应用于class Vector<T>
(而不是将其应用于选定的方法)。
只是为了澄清:这大大限制了可能的类型T
只允许6种类型(float
,double
,long double
以及相应的std::complex<>
类型)。当然,可以允许整数类型,但如果你想对整数向量进行向量运算,我会感到惊讶。