嗨,我在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>::iterator
或map<int,T>:const_iterator
不能在模板内的任何地方工作,而不仅仅是在for循环中工作。