(1) Не добавляйте что-либо в пространство имен std
(2) Как указывает Space_C0wb0y, (2) не является частичной специализацией,но перегрузка.Я не уверен, что это стандартное поведение, но на VS2008 это решено правильно (перегруженная версия используется для карты).В любом случае, я думаю, что немного лучшая версия была бы:
template<typename C>
bool contains(const C & mapContainer, const typename C::key_type & key)
{
// std::map.find() is better than std::find used in (1)
return mapContainer.find(key) != mapContainer.end();
}
Это частичная специализация (T специализируется на C :: key_type) и будет работать для всех типов, которые имеют type_f key_type (например,std :: map, boost :: unordered_map и т. д.)
(3) Поместить в отдельное пространство имен (см. ответ @ Тони)
Sidenote: Я не уверен, что думаю, что эти функции должны иметьодно и то же имяЕсли бы я увидел, что функция содержит () принимающую карту + другой аргумент, я мог бы подумать, что (1) функция проверяет, содержит ли карта запись для данного значения (например, какой-то ключ имеет предоставленное значение), или (2) функция проверяетесли есть такая запись на карте (например, предоставленное значение является парой).Вместо этого я бы вызвал функцию contains_key () для карт.
Редактировать: После небольшой проверки я подозреваю, что приведенный выше код не соответствует, так как использует "шаблон typedefs«.Это не стандартная функция C ++, но кажется, что Visual Studio поддерживает ее в некоторых случаях.Вероятно, есть обходной путь для этого, но не тот, который я достаточно умен, чтобы придумать сейчас.