При использовании шаблонов иногда надо писать typename у типов - когда и зачем это делать?
template
std::cout << optcstr;
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
std::cout << *pos << ' ';
}
std::cout << std::endl;
}
Ответ
Проблема в том, что T::const_iterator — зависимое имя: оно зависит от параметра шаблона T. В этой точке компилятор не знает, каким будет T, и не может предсказать, будет ли T::const_iterator именем типа или, например, именем статического поля или вообще шаблона. Поэтому он и не пытается угадать, и предполагает, что это поле.
Если же ему подсказать, он будет предполагать, что T::const_iterator — это тип, и поймёт, что
typename T::const_iterator pos;
— объявление переменной.
Почему же компилятор не может подождать с выяснением смысла выражения T::const_iterator до того момента, когда тип T будет уже известен (то есть, до момента разворачивания шаблона с конкретным типом T)? А вот почему: на момент применения шаблона тип T имеет право быть ещё не определён! И ещё он может зависеть от самого шаблона. Так что откладывать выяснение смысла выражения нельзя. Пример:
template
class length : public comparable
template
struct T1
{
typedef int iterator;
};
struct T2
{
static const int iterator = 5;
};
struct T3
{
template
struct T4
{
struct Titerator
{
Titerator operator < (int value)
{
cout << "in operator < " << value << endl;
return Titerator();
}
bool operator > (int value)
{
cout << "in operator > " << value << endl;
return false;
}
};
static Titerator iterator;
};
T4::Titerator T4::iterator = T4::Titerator();
int main(int argc, char* argv[])
{
A
Комментариев нет:
Отправить комментарий