listだと良くてSetだとダメな理由 – プログラミング – Home

listだと良くてSetだとダメな理由
 
通知
すべてクリア

[解決済] listだと良くてSetだとダメな理由


ホウジョウウサギ
 ホウジョウウサギ
(@ホウジョウウサギ)
ゲスト
結合: 18年前
投稿: 73
Topic starter  

環境: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;
}


引用未解決
トピックタグ
ホウジョウウサギ
 ホウジョウウサギ
(@ホウジョウウサギ)
ゲスト
結合: 18年前
投稿: 73
Topic starter  

すみません,なんとなく自己解決しました.
(setがデータ並びを管理するためには,*iはconst参照にならなきゃだめですね)

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました