我正在玩新的VS 2012,我可能会遇到新的C ++ 11问题。 当我在项目设置中将平台工具集设置为VS2010(v100)时,这种代码很有效。
·H:
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);
的.cpp:
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中不起作用?
答案 0 :(得分:5)
这只是一种可能性,我现在无法检查,但它们改变了在vc ++ 11中实现迭代器的方式,因此它们可能是相同的底层类型,因此无法在其上重载。
是否要求不同容器类型的迭代器本身具有不同的类型?
请参阅此http://blogs.msdn.com/b/vcblog/archive/2012/04/06/10291485.aspx
答案 1 :(得分:1)
我能想到的两种可能性是,因为_RemoveBlockL
是为编译器保留的,所以改变了一些东西,现在它被保留了,或者在新编译器中,两个迭代器实际上是同一类型的别名。您是否真的需要不同的功能行为,具体取决于它是map
还是multimap
?
假设你这样做(因为typedef名称),正确的解决方案是不使用重载来解决这个问题。给出代表它们实际功能的函数名称(或者你也可以使用strong_typedef
来建立一个强大的别名,这样你就可以重载但我无法看到完整的解决方案。)