Я просто играю с новым 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?
Я могу подумать о двух возможностях: _RemoveBlockL
зарезервировано для компилятора, что-то изменилось и теперь зарезервировано, или что в новом компиляторе два итератора фактически имеют псевдоним одного типа. Вам действительно нужно другое функциональное поведение в зависимости от того, является ли это map
или же multimap
?
Предполагая, что вы делаете (из-за имен typedef), правильное решение просто не использовать перегрузку Для решения этой проблемы. Дайте названия функций, которые представляют то, что они на самом деле делают (или, альтернативно, вы можете использовать strong_typedef
сделать сильный псевдоним, чтобы вы могли перегрузить, но я не могу представить себе полное решение).
Это просто возможность, я не могу проверить в данный момент, но они изменили способ реализации итераторов в vc ++ 11, поэтому возможно, что они имеют один и тот же базовый тип, что делает невозможным перегрузку.
Требуется ли, чтобы итераторы для разных типов контейнеров сами имели разные типы?
Видеть это http://blogs.msdn.com/b/vcblog/archive/2012/04/06/10291485.aspx