warning C4239について – プログラミング – Home

通知
すべてクリア

[解決済] warning C4239について


ジェルヴェ
 ジェルヴェ
(@ジェルヴェ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

初歩的な質問で恐縮なのですが、

CList<CString, CString&> m_list;
m_list.AddTail(CString(_T(TEST)));

とすると

warning C4239: 非標準の拡張機能が使用されています : 'argument' : 'class CString'
から 'class CString &' への変換です。
'const' に対してではない参照は 非 lvalue へバインドできません。

というウォーニングが出ます。
このウォーニングがでないようにコーディングするにはどうしたらいいでしょうか?

開発環境はWinMe, VC++6.0SP5(warningレベル4) MFCです。


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

CList<CString, CString&> m_list;
CString cstr= _T(TEST);
m_list.AddTail(cstr);

ではダメですか?


返信引用
ジェルヴェ
 ジェルヴェ
(@ジェルヴェ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

tibさんのコードでウォーニングはでなくなりました。
AddTailに一時オブジェクトを渡してるのがまずいんでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> AddTailに一時オブジェクトを渡してるのがまずいんでしょうか?

ってゆーか、

> CList<CString, CString&> m_list;
^^^^^^^^
って書くことで、まずくしたのはあなたです。


返信引用
ジェルヴェ
 ジェルヴェ
(@ジェルヴェ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

επιστημηさんのおっしゃてることが今ひとつ理解できません。
MSDNに
------------------------------------------
template< class TYPE, class ARG_TYPE >
class CList : public CObject

引数

TYPE

リストに格納されるオブジェクトの型。

ARG_TYPE

リストに格納されているオブジェクトを参照するときに使う型。通常は TYPE 型の参照です。
-------------------------------------------
と書いてあったので、CList<CString, CString&>としたのですが・・・


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> リストに格納されているオブジェクトを参照するときに使う型。通常は TYPE 型の参照で
す。
> -------------------------------------------
> と書いてあったので、CList<CString, CString&>としたのですが・・・

...としたからそのwarningが発生したってことです。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

ARG_TYPEは、CArrayのメンバ関数の引数にTYPEオブジェクトを渡す時の型ですから、
CArray<CString,const CString&>
の方が良いのではないでしょうか。
const参照なら、一時オブジェクトの参照を指定できます。


返信引用
ジェルヴェ
 ジェルヴェ
(@ジェルヴェ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

επιστημηさんのおっしゃりたいことは
一時オブジェクトをAddTailに渡すなら
CList<CString, CString&>
ではなく
CList<CString, const CString&>
にしなさい。

ということでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

YES. ってゆーか、やってみましょう。


返信引用
ジェルヴェ
 ジェルヴェ
(@ジェルヴェ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

はい。すでにやってみました。
結果はウォーニングはでませんでした。

C++はブランクが3年ほどあるので、
ちょっとおマヌケな質問でした。

親切に回答してくださった方、ありがとうございました。

ということで解決済みにしておきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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