1

私のコードはもともと次のようなものでした:

int SomeObject::operator[]( const string& key ) const
{
    return ( *m_Map )[ key ];
}

int SomeObject::operator()( const string& key ) const
{
    return ( *m_Map2 )[ key ];
}

これらのマップには両方とも、次の署名がありました。

std::map< std::string, int >

そして、明示的なヒープ割り当てを実際に必要としないSTLコンテナーについて何かを読みました(つまりstd::map< ... >* map = new std::map< ... >、それは私がしていたことです)。

マップをスタック割り当てに変更し、ポインター逆参照を削除するとすぐに、次のようになります。

int SomeObject::operator[]( const string& key ) const
{
    return m_Map[ key ];
}

int SomeObject::operator()( const string& key ) const
{
    return m_Map2[ key ];
}

コンパイラは、次のエラーで不平を言います (両方のマップに対して):

Error   1   error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)

ワット。

4

1 に答える 1

5

問題は、マップを変更するようconstに関数をマークしたことです(キーがマップにない場合、要素はデフォルト値で追加されます)。operator[]()std::map

constポインターが参照するオブジェクトではなく、メンバーポインターにのみ適用されるため、ポインターを使用する場合はこれを回避できます。

次のようなものでconst問題を回避できます。

int SomeObject::operator[]( const string& key ) const
{
    std::map<string,int>::const_iterator it(m_Map.find(key));

    if (it == m_Map.end()) {
        throw /* something */;
    }

    return it->second;
}
于 2012-12-04T08:17:11.537 に答える