1

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 行目の識別子 'begin' の前。型指定子がありません - int と見なされます。注: C++ は 15 行目の default-int をサポートしていません。構文エラー: ';' がありません 16 行目の識別子 'end' の前。型指定子がありません - int と見なされます。注: C++ は、16 行目の default-int をサポートしていません。

しかし、に変更vector<T>::const_iteratorするvector::const_iterator方法のようには思えません。また、「auto」に変更しても機能しません。これにより、「末尾の戻り値の型が期待される」ようになります。行 15、16、および 17 を削除し、A.begin() を A.data.begin() に置き換え、それに応じて次の 2 つの引数を置き換えると、すべて問題ありません。しかし、元のコードが機能しないのはなぜですか? どうすれば機能させることができるでしょうか?

4

1 に答える 1

5

あなたは書く必要があります

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

これはvector<T>::const_iterator、依存名 (型パラメーターに依存するT) であるため、コンパイラーはそれが型であることを伝える必要があるためvector<T>::const_iteratorです (たとえば、enum値や静的データ メンバーではありません)。

于 2012-10-19T12:12:32.273 に答える