1. 程式人生 > >error C2593: 'operator =' is ambiguous 不明確

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)" ";