1

std::vector の追加のサポートを追加しようとしています。ここに私がこれまでに持っているコードがあります..動作しない部分は、結果を印刷しようとする部分です。私は valarray を認識していますが、思い通りに動作させることができません (ほとんどの場合、ベクトルを valarray に変換する簡単な方法が見つかりませんでした)。

これはエラーです:

../src/VectorOperations.cpp:26:6: error: need 'typename' before 'std::vector<T>::iterator' because 'std::vector<T>' is a dependent scope

class VectorOperations
{
public:
    //Vector Operations
    std::vector<double> logv(std::vector<double> first);
    std::vector<double> raiseTo(std::vector<double> first, int power);
    std::vector<double> xthRoot(std::vector<double> first, int xth);
    double sumv(std::vector<int> first);

    std::vector<double> operator + ( const std::vector<double> & ) const;
    std::vector<double> operator - ( const std::vector<double> & ) const;
    std::vector<double> operator * ( const std::vector<double> & ) const;
    std::vector<double> operator / ( const std::vector<double> & ) const;

};


template <typename T>
std::vector<T> operator+(const std::vector<T>& a, const std::vector<T>& b)
{
    assert(a.size() == b.size());
    std::vector<T> result;
    result.reserve(a.size());
    std::transform(a.begin(), a.end(), b.begin(),
               std::back_inserter(result), std::plus<T>());

    std::cout<<"Results from addition follow: \n";
    //HERE'S THE PROBLEM: I WANT TO PRINT OUT BUT I GET ERRORS
        for(std::vector<T>::iterator it = a.begin(); it != a.end(); ++it) {
            /* std::cout << *it; ... */
        }
    return result;
}
4

3 に答える 3

1

std::vector<T>::iteratorテンプレートの種類によって異なりますが、追加してみてくださいtypename

for(typename std::vector<T>::iterator it = a.begin(); it != a.end(); ++it) {
    ^^^^^
于 2013-02-17T04:32:06.123 に答える
1

コンパイラ エラーは、何をすべきかを正確に示しています。ただし、独自のループをロールするのではなくfor、次を使用することをお勧めしstd::copy()ます。

std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));

例えば:

template <typename T>
std::ostream& operator <<(std::ostream& os, std::vector<T> const& v)
{
    os << "{";
    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));
    return os << "}";
}

[好みに合わせて独自のフォーマット スタイルを適用します。]

次に、次のように呼び出すことができます。

std::cout << "Results from addition follow: \n" << result << std::endl;

[できれば外部 operator +から、これは 2 つの を追加することの予期しない副作用になるためvectorです。]

于 2013-02-17T05:41:20.157 に答える
0

の前にtypenameを追加しstd::vector<T>::iterator itます。typename std::vector<T>::iterator
typenameに関する詳細情報については、このSOリンクを参照してください。「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

于 2013-02-17T04:33:07.710 に答える