2

イテレータ範囲からマップを構築しようとする以下のコードを考えてみましょう:

#include <map>

template< typename C >
typename C::const_iterator cbegin( C const & c )
{
    return c.begin();
}

template< typename C >
typename C::const_iterator cend( C const & c )
{
    return c.end();
}

int main()
{
    typedef std::map<const int, int > Map;

    Map m1;
    Map m2( m1.begin(), m1.end() );
    Map m3( m1.begin(), m1.end(), std::less<const int>() );
    Map m4( cbegin( m1 ), cend( m1 ), std::less<const int>() );
}

// cl -nologo -EHsc vc6-map.cpp && vc6-map
// g++ -Wall -Wextra -Weffc++ -std=c++11 -o vc6-map vc6-map.cpp && vc6-map

g++ 4.8.1 はコードを正常にコンパイルしますが、Visual C++ 6、SP6 (VC6) は m2、m3、および m4 のそれぞれの構築に失敗します。

VC6 では次のエラーが発生します。

prompt>cl -nologo -EHsc vc6-map.cpp && vc6-map
vc6-map.cpp
vc6-map.cpp(22) : error C2664: '__thiscall std::map<int const ,int,struct std::less<int const >,class std::allocator<int
> >::std::map<int const ,int,struct std::less<int const >,class std::allocator<int> >(const struct std::less<int const >
 &,const class std::allocator<int> &)' : cannot convert parameter 1 from 'class std::_Tree<int const ,struct std::pair<i
nt const ,int>,struct std::map<int const ,int,struct std::less<int const >,class std::allocator<int> >::_Kfn,struct std:
:less<int const >,class std::allocator<int> >::iterator' to 'const struct std::less<int const > &'
        Reason: cannot convert from 'class std::_Tree<int const ,struct std::pair<int const ,int>,struct std::map<int co
nst ,int,struct std::less<int const >,class std::allocator<int> >::_Kfn,struct std::less<int const >,class std::allocato
r<int> >::iterator' to 'const struct std::less<int const >'
        No constructor could take the source type, or constructor overload resolution was ambiguous
vc6-map.cpp(23) : error C2664: '__thiscall std::map<int const ,int,struct std::less<int const >,class std::allocator<int
> >::std::map<int const ,int,struct std::less<int const >,class std::allocator<int> >(const struct std::pair<int const ,
int> *,const struct std::pair<int const ,int> *,const struct std::less<int const > &,const class std::allocator<int> &)'
 : cannot convert parameter 1 from 'class std::_Tree<int const ,struct std::pair<int const ,int>,struct std::map<int con
st ,int,struct std::less<int const >,class std::allocator<int> >::_Kfn,struct std::less<int const >,class std::allocator
<int> >::iterator' to 'const struct std::pair<int const ,int> *'
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

vc6-map.cpp(24) : error C2664: '__thiscall std::map<int const ,int,struct std::less<int const >,class std::allocator<int
> >::std::map<int const ,int,struct std::less<int const >,class std::allocator<int> >(const struct std::pair<int const ,
int> *,const struct std::pair<int const ,int> *,const struct std::less<int const > &,const class std::allocator<int> &)'
 : cannot convert parameter 1 from 'class std::_Tree<int const ,struct std::pair<int const ,int>,struct std::map<int con
st ,int,struct std::less<int const >,class std::allocator<int> >::_Kfn,struct std::less<int const >,class std::allocator
<int> >::const_iterator' to 'const struct std::pair<int const ,int> *'
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

m2 の場合、VC6 は適切なコンストラクターを呼び出すことができないようです。std::lessこれは、比較オブジェクトを指定することにより、m3 と m4 の構築のために解決されます。m3 と m4 の構成の誤差の唯一の違いは、iteratorconst_iteratorです。

必要なことを行うために VC6 をどのように騙すことができますか?

2013 年 10 月 14 日編集: VC6 マップ範囲コンストラクターは次のように定義されます。

typedef const value_type *_It;
map(_It _F, _It _L, const _Pr& _Pred = _Pr(), const _A& _Al = _A()) {...}

これはエラーを明確にします: VC6 バージョンにはstd::pair<> const *とは異なる が必要std::map<>::const_iteratorです。

4

1 に答える 1