listだと良くてSetだとダメな理由

[戻る]
ホウジョウウサギ 2013/05/08(水) 11:19:08
環境:Win7, VS2012

以下のようなコードで,コンパイルエラーの理由がわからず困っています.
(エラー内容は,下記コード内にてエラーとなる箇所にコメント記載しました)

'CTest *const *' から 'CTest **' に変換できません
といわれてしまうのですが,なぜconstがついてしまったのでしょうか.


//エラー状況を再現させるためのクラス.
//(実際に扱いたいデータはOpenCVのIplImageという型,
// 生成に IplImage *cvCreateImage(...)
// 破棄に void cvReleaseImage( IplImage** )
// という関数を使う)
class CTest
{
private:
    CTest( int a=0 ) : m_Data(a) {}
    int m_Data;

public:
    static CTest *Create( int a )   //生成
    {   return new CTest(a);    }

    static void Release( CTest **pCTest )   //破棄
    {
        delete *pCTest;
        *pCTest = NULL;
    }
};

//
int _tmain(int argc, _TCHAR* argv[])
{
    {//ためしにListに格納すると問題ない
        std::list<CTest*> L;
        L.insert( L.end(), CTest::Create(5) );
        L.insert( L.end(), CTest::Create(4) );
        L.insert( L.end(), CTest::Create(3) );

        for( auto i=L.begin();  i!=L.end(); i++ )
        {
            CTest::Release( &*i );
        }
    }

    {//コンテナ内の値の重複を避けたいのでSetを使いたいのだが,こっちだとエラーになる
        std::set<CTest*> S;
        S.insert( CTest::Create(5) );
        S.insert( CTest::Create(4) );
        S.insert( CTest::Create(3) );

        for( auto i=S.begin();  i!=S.end(); i++ )
        {
            //error C2664: 'CTest::Release' : 1 番目の引数を 'CTest *const *' か
ら 'CTest **' に変換できません。
            CTest::Release( &*i );
        }
    }

    return 0;
}

ホウジョウウサギ 2013/05/08(水) 12:01:15
[[解決]]
すみません,なんとなく自己解決しました.
(setがデータ並びを管理するためには,*iはconst参照にならなきゃだめですね)

#VS2005だとコンパイル通ってたのだが,大丈夫だったのだろうか?

古いスレッドには追加発言できません。