error C2593: 'operator =' is ambiguous 不明確
在VS開發環境下,建立的MFC工程。
百度知道上有人說
把#include < iostream>
using namespace std;
改為
#include<iostream.h>
但我試了會報錯:
error C1083: Cannot open include file: ‘iostream.h’: No such file or directory
看了CSDN上一篇部落格,有點啟發:
定義了一個CString 物件m_strInputLine 在訊息處理函式中:
void CTextView::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
m_strInputLine += nChar;
}編譯時出錯 說過載操作符出錯,提示資訊:error C2593: “operator +=”不明確
解答如下:
CString,在vs2008中,為unicode,wchar_t基型別。
而CString,在vc6.0中為ansi,char基型別。所以在vs2008: m_strInputLine是wchar_t。
應將UINT nChar轉換成wchar_t。
在處理鍵盤輸入讀取按鍵時:
void CWriterView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { //TODO: Add your message handler code here and/or call default CWriterDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->StringData += (char)nChar; Invalidate(); CView::OnChar(nChar, nRepCnt, nFlags); }
編譯時出現“operator +=”不明確,也就是pDoc->StringData += nChar;
改正方法:
pDoc->StringData+=(char)nChar,因為系統裡面存在一個wchar_t的型別,所以如果支援了這個型別的話,從unsigned nt轉換到wchar_t和char的等級都是標準轉換,所以編譯器無法判斷到底應該轉換到哪一個,故而導致了這個問題。
我原來的程式碼是在vc6.0執行成功的,在vs2010報錯。應該是不同編譯器預設編碼不同導致的。
因為我同時還報錯:
error C2664: ‘strtol’ : cannot convert parameter 1 from ‘CString’ to 'const char
不能將引數 1 從“CString”轉換為“const char *”;
(error C2664: “atoi”: 不能將引數 1 從“CString”轉換為“const char *”))
在vc6.0下用CString str;num = atoi(str);就可以順利取到num;
但是同樣程式碼拿到vs2008就報錯,error C2664: “atoi”: 不能將引數 1 從“CString”轉換為“const char ”;
於是把CString 強制轉換為char,num = atoi((LPSTR)(LPCTSTR)str);
編譯不報錯,執行成功。但是後面發現,本來str=“123”,num應該是123,結果卻只是1,試了其他的都是隻取最前面一位。
後面百度中無意發現,原來是,vc6.0預設是ansi編碼,所以atoi可以直接用,結果也正確;但是VS2008預設的編碼方式是Unicode,Unicode下不能用atoi,而要使用_wtoi 也可以直接使用_ttoi,它在 ANSI 編碼系統中被編譯成atoi(),而在 Unicode 編碼系統中編譯成_wtoi()。或者把vs改成ansi編碼也行。
num = _ttoi(str);(_ttoi類似於_T,隨著編碼方式會改變)。
VS2008預設的字符集是Unicode,而VC6.0預設是多位元組字符集,Unicode字符集你要加_T("")或L"",你也可以“工程-屬性-修改字符集”。
我在使用過程中的時候是用了定義了一個CString 物件space
但是我在使用這個方法是
m_space=m_space+" ";
編譯出錯:
error C2593: “operator =”不明確 1>
原因:是因為兩個的編碼型別不同,
CString,在vs2010中,為unicode,wchar_t基型別。
而CString,在vc6.0中為ansi,char基型別。
所以我們必須強制型別轉換
吧char型改為wchar_t型別;
1:
CString strTemp; strTemp.Format("%d", nChar); m_strLine += strTemp;
2:
m_space=m_space+(wchar_t)" ";