4

我只是在玩新的 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 中不起作用?

4

2 回答 2

5

这只是一种可能性,我目前无法检查,但他们改变了在 vc++11 中实现迭代器的方式,因此它们可能是相同的底层类型,因此无法对其进行重载。

是否要求不同容器类型的迭代器本身具有不同的类型?

请参阅此http://blogs.msdn.com/b/vcblog/archive/2012/04/06/10291485.aspx

于 2012-09-06T14:17:30.650 回答
1

我能想到的两种可能性是,因为_RemoveBlockL是为编译器保留的,所以发生了一些变化,现在它被保留了,或者在新的编译器中,两个迭代器实际上别名相同的类型。您是否真的需要不同的功能行为,具体取决于它是 amap还是multimap

假设你这样做(因为 typedef 名称),正确的解决方案是不使用重载来解决这个问题。给出代表它们实际工作的函数名称(或者,您可以使用strong_typedef创建一个强别名,以便您可以重载,但我无法可视化完整的解决方案)。

于 2012-09-06T16:21:58.167 回答