Прошло некоторое время с тех пор, как GCC поймал меня с этим, но это случилось сегодня. Но я никогда не понимал, почему GCC требует typedame typedef в шаблонах, в то время как VS и я предполагаю, что ICC этого не делают. Является ли typpedame типа typedef "ошибкой" или слишком строгим стандартом или что-то, что осталось от авторов компилятора?
Для тех, кто не знает, что я имею в виду здесь, это образец:
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();
}
Примечание. Это не фактическая функция, которую я использую, а просто что-то глупое, что демонстрирует проблему.