將舊 VC++ 6.0 專案遷移至 VS2012 後,呼叫 CListCtrl::SetItemText 時出現:
error C2664: 'CListCtrl::SetItemText': 無法將參數 3 從 'CStringW' 轉換為 'LPCTSTR'
原因:VS2012 預設使用 Unicode 字元集,CString 實際為 CStringW(wchar_t*),而 SetItemText 期望 LPCTSTR(在 Unicode 專案中同為 const wchar_t*),但 CStringW 不提供隱含轉換運算子,需顯式轉型。
m_ctrList.SetItemText(i, 1, (LPCTSTR)rs.m_data.Format(_T("%Y-%m-%d")));
m_ctrList.SetItemText(i, 2, (LPCTSTR)rs.m_name);
// ... 其餘同理
或使用 GetString() / GetBuffer() 取得原始指標。
CStringW::operator LPCTSTR() 隱含轉換,強制開發者明確意圖,避免 ANSI/Unicode 混用導致的難以發現 Bug。_T()、TEXT() 宏與 CString 模板類別。CStringW,務必在傳遞給 Win32 API 或 MFC 控件方法前做顯式轉型。