在我自己的班级上使用std :: inner_product

Using std::inner_product on my own class

本文关键字:std inner product 自己的 我自己      更新时间:2023-10-16

我想出了自己的小班级,称为tinyVector。现在,我正在尝试在其中使用std :: inner_product。但是我无法正常工作,我不明白为什么这不起作用。我正在使用Visual Studio 2012。

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
template<class T, int N>
class TinyVector {
public:
    TinyVector() { data = vector<T>(N, 0); }
    explicit TinyVector(const T initVal) { data = vector<T>(N, initVal); }
    ~TinyVector() { data.clear(); }
    inline T& operator[](int i) { return data[i]; }
    inline T operator[](int i) const { return data[i]; }
    inline vector<T>::const_iterator begin() const { return data.begin(); } //Line 15
    inline vector<T>::const_iterator end() const { return data.end(); } //Line 16
private:
    vector<T> data;
};
template<class T, int N>
inline double dot(const TinyVector<T,N>& A, const TinyVector<T,N>&  B)
{
    return inner_product(A.begin(), A.end(), B.begin(), 0.0);
}
int main()
{
    TinyVector<double, 10> Ty;
    for (int i = 0; i < 10; ++i)
        Ty[i] = i;
    cout << dot(Ty,Ty) << endl;
}

编译器告诉我:语法错误:缺少';'在标识符"开始"之前,在第15行。缺少类型的说明符 - 假设INT。注意:C 不支持第15行上的默认设置。语法错误:缺少';'在第16行上的标识符"结束"之前。缺少类型的说明符 - 假设INT。注意:C 不支持第16行上的默认设置。

但是将vector<T>::const_iterator更改为vector::const_iterator似乎不是要走的路。也将其更改为"自动"不起作用。这给了我"预期的落后返回类型"。如果我将行15,16和17删除,然后用A.Data.Begin()替换A.Begin(),而接下来的两个参数会迅速替换,那么一切都很好。但是,为什么我的原始代码不起作用,我该如何工作?

您需要写

inline typename vector<T>::const_iterator begin() const { return data.begin(); } //Line 15
       ^^^^^^^^

这是因为vector<T>::const_iterator是一个因名称(它取决于类型参数T),因此需要告诉编译器vector<T>::const_iterator是一种类型(而不是enum值或静态数据成员)。<<<<<<<<<<<<<<<<<<<</p>