C ++:默认初始化模板函数中的整数类型

时间:2013-08-08 07:16:20

标签: c++ templates

出于教育目的,我正在使用自己的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.0Vector<double>)?我试过T t();但是然后g ++告诉我,例如,“double(*)()”在return语句中不能转换为“const double”,并且operator+=()不会被定义为“({ double(),double)“。

非常感谢!

2 个答案:

答案 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种类型(floatdoublelong double以及相应的std::complex<>类型)。当然,可以允许整数类型,但如果你想对整数向量进行向量运算,我会感到惊讶。