Требуется ли указывать для зависимого имени 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]

Тип шаблона аргумент является зависимым, если тип, который он указывает, является зависимым.

Другие вопросы по тегам