类型为template <T>的std :: map的迭代器

时间:2019-12-04 19:10:22

标签: c++ templates vector

嗨,我在for循环内的模板中使用map<int,T>::const_iterator it时遇到错误。

error: need ‘typename’ before ‘std::map<int, T>::const_iterator’ because ‘std::map<int, T>’ is a dependent scope
     for ( map<int,T>::const_iterator it = data[k].begin(); it != data[k].end(); ++it)
           ^~~~~~~~~~

问题是,如果我使用map<int,T>而不是map<int,double>,则代码有效。这是我可以接受的“解决方案”,但我想知道是否有人可以向我解释发生了什么,为什么?甚至甚至告诉我如何使用<T>使它正常工作。

我不知道它是否是必需的,但我将要使用的代码的整个部分括起来,标出使用的行。

template <typename T>
class sparse_matrix: public matrix<T> //saves memory if we use map for sparse matrices
{
public:

    int i; // rows
    int j; // columns

    vector<map<int,T> > data; //map indexed with integer (like vector)

    sparse_matrix() {}; //default constructor
    sparse_matrix(int k): i(k), j(k) //square matrix
    {
        data.resize(i);
    };
    sparse_matrix(int k, int m): i(k), j(m) //rectangular matrix
    {
        data.resize(i);//init rows
        //no need to initialize cols
    };

    ~sparse_matrix() {}; //destructor

    map<int, T>& operator[] (int k) // so we can use A[i][j]
    {
        return data[k];
    };

    vector<T> operator* (const vector<T>& a) //multiplication by vector
    {
        vector<T> c(i);
        if (j == a.size()) //cols of matrix have to be eq to rows of said vect
        {
            for (int k=0; k<i; ++k) //cycle rows
            {
                c[k]=0.;

//here is the part that does not work
                for ( map<int,T>::const_iterator it = data[k].begin(); it != data[k].end(); ++it)
                {
                    c[k] += it->second * a[it->first];
                }
            }
        }
        else
        {
            cout << "Cannot multiply matrix " << i << "x" << j << "with column vector " << a.size() << endl;
            exit(1);
        }

        return c;
    }
};

PS:我发现map<int,T>::iteratormap<int,T>:const_iterator不能在模板内的任何地方工作,而不仅仅是在for循环中工作。

0 个答案:

没有答案