首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2012 MFC OnInitialUpdate 未宣告與字串字面值型別錯誤

     編輯:程式設計綜合問答

錯誤 1:OnInitialUpdate 未在類別中宣告

error C2509: "OnInitialUpdate": 成員函數沒有在 "CCteFormView" 中聲明

解決

在標頭檔 CteFormView.h 類別定義中加入宣告:

class CCteFormView : public CFormView {
    // ...
protected:
    virtual void OnInitialUpdate(); // 必須加上 virtual
    // ...
};

並確認 IMPLEMENT_DYNCREATE / DECLARE_DYNCREATE 宏正確。

錯誤 2/3:字串字面值型別不匹配 (Unicode 專案)

error C2664: 無法將參數 2 從 "const char [1]" 轉換為 "LPCTSTR"
error C2664: 無法將參數 1 從 "const char [3]" 轉換為 "const wchar_t *"

原因

專案設定 **Character Set = Use Unicode Character Set** (VS 預設)。
LPCTSTR → const wchar_t*,CString 內部為 wchar_t。
普通字串字面值 "abc" 為 const char* (ANSI),型別不符。

解決:使用 _T() 或 TEXT() 宏

// 錯誤
m_ctlList.InsertItem(0, "");
str.Format("%d", i);

// 正確
m_ctlList.InsertItem(0, _T(""));
str.Format(_T("%d"), i);
// 或
m_ctlList.InsertItem(0, L"");
str.Format(L"%d", i);

最佳實務

  • **所有字串字面值統一加 _T()**,確保 ANSI/Unicode 專案皆可編譯。
  • 新專案建議直接用 Unicode,不再維護 ANSI 相容。
  • CString 格式化字串同樣需 _T()。

補充:OnInitialUpdate 典型用法

void CCteFormView::OnInitialUpdate() {
    CFormView::OnInitialUpdate(); // 呼叫基底
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit(); // 視需求
    // 初始化 ListCtrl 欄位等
    m_ctlList.InsertColumn(0, _T("項目"), LVCFMT_LEFT, 100);
}

補上虛函式宣告、統一使用 _T() 宏,即可解決 VS2012 MFC Unicode 專案常見編譯錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved