環境: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;
}
すみません,なんとなく自己解決しました.
(setがデータ並びを管理するためには,*iはconst参照にならなきゃだめですね)
#VS2005だとコンパイル通ってたのだが,大丈夫だったのだろうか?