在我自己的类上使用std :: inner_product

Dom*_*fer 1 c++ iterator vector

我想出了一个名为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;
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我:语法错误:缺少';' 在第15行标识符'begin'之前.缺少类型说明符 - 假定为int.注意:C++不支持第15行的default-int.语法错误:缺少';' 在第16行的标识符'end'之前.缺少类型说明符 - 假定为int.注意:C++不支持第16行的default-int.

但改变vector<T>::const_iteratorvector::const_iterator似乎不太可能.将其更改为"自动"也不起作用.这给了我"预期的尾随返回类型".如果我删除第15,16和17行并用A.data.begin()替换A.begin()和接下来的两个参数,一切都很好.但为什么我的原始代码不起作用,我怎样才能使它工作?

eca*_*mur 5

你需要写

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

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