Требуется ли указывать для зависимого имени typename, если оно используется в качестве аргумента шаблона?
template<class mapT, class K, class V>
void f(mapT& m, const K& k, const V& v)
{
pair<mapT::iterator, bool> p = m.insert(make_pair(k, v));
}
MSVC принимает этот код без ошибок и предупреждений. Что стандарт должен сказать по этому поводу? Разрешено ли (необязательно), не разрешено (запрещено) или требуется (обязательно) квалифицировать T::iterator с typename в примере выше? Меня особенно интересуют правила C++03, хотя, если что-то изменилось за 11, было бы неплохо узнать. Спасибо.
1 ответ
MSVC не соответствует, фрагмент плохо сформирован; мы должны явно написать typename T::iterator
ссылаться на имя типа iterator
внутри T
, поскольку это зависимый тип.
Это известная ошибка в компиляторе, см. Соответствующий отчет об ошибке:
Что говорит стандарт? ( 14882-2003)
14.6.2.2p1
Зависимые типы[temp.dep.type]
Тип зависит, если он
параметр шаблона,
квалифицированный идентификатор со спецификатором вложенного имени, который содержит имена классов, которые называют зависимый тип или чей неквалифицированный идентификатор называет зависимый тип,
...
14.6.2.4p1
Зависимые аргументы шаблона[temp.dep.temp]
Тип шаблона аргумент является зависимым, если тип, который он указывает, является зависимым.