Прошло много времени с тех пор, как GCC поймал меня с этим, но это произошло сегодня. Но я никогда не понимал, почему GCC требует typedef typename в шаблонах, а VS и я полагаю, что ICC этого не делает. Является ли typepef typename «ошибкой» или чрезмерным стандартом, или что-то, что оставлено на усмотрение разработчиков компиляторов?
Для тех, кто не знает, что я имею в виду, вот пример:
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
std::map<KEY,VALUE>::const_iterator iter = container.find(key);
return iter!=container.end();
}
Приведенный выше код компилируется в VS (и, вероятно, в ICC), но завершается ошибкой в GCC, потому что он хочет это так:
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename
iterator iter = container.find(key);
return iter!=container.end();
}
Примечание: это не настоящая функция, которую я использую, а просто глупость, демонстрирующая проблему.