VC ++ 11 map и многокартовые итераторы (перегрузка) C2535

Я просто играю с новым VS 2012, и у меня, вероятно, проблема с новым C ++ 11.
Этот пик кода отлично работает, когда я установил набор инструментов платформы на VS2010 (v100) в настройках проекта.

.час:

typedef std::multimap<unsigned, unsigned>   SizeMap;
typedef std::map<unsigned, unsigned>        OffsetMap;

private:
inline void _RemoveBlockL(SizeMap::iterator sizeI);
inline void _RemoveBlockL(OffsetMap::iterator offsetI);

.каст:

inline void Foo::_RemoveBlockL(SizeMap::iterator sizeI)
{
// impementation
}

inline void Foo::_RemoveBlockL(OffsetMap::iterator offsetI)
{
// impementation
}

Но когда я изменю это для VS2012 (v110), я получу эти ошибки:

Error   61  error C2535: 'void
Boo::system::Foo::_RemoveBlockL(std::_Tree_iterator<_Mytree>)' : member function already
defined or declared D:\_work\wp-test\boo\system\foo.h

Почему перегрузка не работает в VC ++ 11?

4

Решение

Я могу подумать о двух возможностях: _RemoveBlockL зарезервировано для компилятора, что-то изменилось и теперь зарезервировано, или что в новом компиляторе два итератора фактически имеют псевдоним одного типа. Вам действительно нужно другое функциональное поведение в зависимости от того, является ли это map или же multimap?

Предполагая, что вы делаете (из-за имен typedef), правильное решение просто не использовать перегрузку Для решения этой проблемы. Дайте названия функций, которые представляют то, что они на самом деле делают (или, альтернативно, вы можете использовать strong_typedef сделать сильный псевдоним, чтобы вы могли перегрузить, но я не могу представить себе полное решение).

1

Другие решения

Это просто возможность, я не могу проверить в данный момент, но они изменили способ реализации итераторов в vc ++ 11, поэтому возможно, что они имеют один и тот же базовый тип, что делает невозможным перегрузку.

Требуется ли, чтобы итераторы для разных типов контейнеров сами имели разные типы?

Видеть это http://blogs.msdn.com/b/vcblog/archive/2012/04/06/10291485.aspx

5

По вопросам рекламы [email protected]