4

新しいVS2012で遊んでいるところですが、おそらく新しい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

私が考えることができる2つの可能性は_RemoveBlockL、コンパイラー用に予約されているため、何かが変更されて予約されているか、新しいコンパイラーでは2つのイテレーターが実際に同じ型をエイリアスすることです。それがaであるかどうかに応じて、実際に異なる機能動作が必要ですmapmultimap

(typedef名のために)そうすると仮定すると、正しい解決策は、この問題を解決するためにオーバーロードを使用しないことです。関数に実際の動作を表す名前を付けます(またはstrong_typedef、オーバーロードできるように強力なエイリアスを作成するために使用できる場合もありますが、完全なソリューションを視覚化することはできません)。

于 2012-09-06T16:21:58.167 に答える