VC6下没错,见文件:
C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\AFX.H
class CString
{
public:
// Constructors // constructs empty CString
CString();
// copy constructor
CString(const CString& stringSrc);
// from a single character
CString(TCHAR ch, int nRepeat = 1);
// from an ANSI string (converts to TCHAR)
CString(LPCSTR lpsz);
// from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpsz);
// subset of characters from an ANSI string (converts to TCHAR)
CString(LPCSTR lpch, int nLength);
// subset of characters from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpch, int nLength);
// from unsigned characters
CString(const unsigned char* psz);
...
有ANSI和UNICODE的构造函数。

解决方案 »

  1.   

    在UNICODE下, CString, 实际上是CStringW.在VS2008下, 你写的那个句代码无错.  不知道你的编译环境.我猜可能并不是你描述的错误, 可能根本不是UNICODE的问题, 而是你代码中的其它问题.还有, 一般来说使用VS中使用字符串, 最好是加上  _T("")  或者 TEXT("")
      

  2.   


    VS2005,新建一个SDI工程,在视图类OnDraw里只加这一条语句:
    void CdlgView::OnDraw(CDC* /*pDC*/)
    {
    CdlgDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
    return;
    CString str="haah"; // TODO: add draw code for native data here
    }
    编译错误:
    Error 1 error C2440: 'initializing' : cannot convert from 'const char [5]' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 54
      

  3.   

    UNICODE字符集的字符串一般都要写成像L"haha"这样的吧? 我在Visual Studio 2010里面如果使用UNICODE字符集的话,像CString肯定是 CString str = L“haha“ 这么赋值的……
      

  4.   

    CString str="haha"报错,//报错,因为CString没有重载参数类型为char*类型赋值操作
    CStriing str("haha”)//不报错,因为CString有重载了参数类型为char*类型的构造函数
      

  5.   

    我的VS2008中可以看到CStringT类源码中是允许 const char *参数构造的, 并且可以不是显示调用.字符串处理程序中, 对于CString这类的带有T的,即字符集相关的数据类型都在常量字符串外面包一层_T("")或者TEXT(""), 这样你就不用再为编译环境是UNICODE还是多字符集而烦恼了.void CdlgView::OnDraw(CDC* /*pDC*/)
    {
        CdlgDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;
        CString str= TEXT("haah");
     
        // TODO: add draw code for native data here
    }
      

  6.   


    注意:  你第一个解释是错的.   CString str="haha"  这里是初始化,不是赋值.   只会调用复制构造函数, 不会调用赋值操作符.
      

  7.   


    注意:  你第一个解释是错的.   CString str="haha"  这里是初始化,不是赋值.   只会调用复制构造函数, 不会调用赋值操作符.是吗?那能否解释一下,啥是复制构造函数啊?复制构造函数不是说,唯一的参数类型是另一个同类型对象的引用吗?
      

  8.   


    详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
    Str = "haha"  // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式:  变量在定义时的=号都是初始化, 而非赋值,  
      

  9.   

    const char[5] 跟 const char*是两个不同类型,你可以强制转换类型,比如 CString str = (const char*)"haah";
    或者:
    const char* s = "haah"; // char s[] = "haah"; 这样也可以用,但是两种方式变量s代表的意义不一样,不过不影响下面的赋值
    CString str = s;
      

  10.   


    详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
    Str = "haha"  // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式:  变量在定义时的=号都是初始化, 而非赋值,  
    你这个说法应该也不对,我做了一下测试,class aString
    {
    public:
    TCHAR* pChar;
    aString()
    {}
    aString(aString& s)
    {
    int l=STRLEN(s.pChar);
    pChar=new TCHAR[l+1];
    STRCOPY(pChar,s.pChar);
    } aString(char*s)
    {
    operator=(s);
    } void operator=(char*s) 
    {
    int l=0;
    #ifdef _UNICODE
    l=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,s,-1,NULL,0);
    pChar=new TCHAR[l];
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,s,-1,pChar,l);
    #else
    int l=strlen(s);
    pChar=new char[l+1];
    strcpy(pChar,s);
    #endif
    }
    };void CMyTestPrj2View::OnTest632889()
    {
    aString s="abc";
    }其在执行aString s="abc";的时候,运行直接调用 aString(char*s),没有经过拷贝构造,检查s的地址,在执行aString(char*s)时的this地址就是  aString s="abc";中的s地址,你可以试试看
      

  11.   


    详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
    Str = "haha"  // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式:  变量在定义时的=号都是初始化, 而非赋值,  
    CString str = "haha" 应该是调用有一个const char *参数的构造函数,不是调用复制构造函数。
    详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
    Str = "haha"  // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式:  变量在定义时的=号都是初始化, 而非赋值,  

    怎么可能会调用复制构造函数?
    应该是调用有const char *参数的类型转换构造函数才对吧。
      

  12.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
      

  13.   

    好厉害啊,这个问题应该是unicode的问题,采用unicode应该就没事了
      

  14.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
    早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
    可以使用CA2T宏转换 CString str = CA2T("haah");
    或者用_bstr_tr自动转换 CString str = _bstr_t("haah");
      

  15.   


    确实, 不是调用复制构造, 是我理解错了.  看来又得复习下基础了.这种初始化是直接调用对应的构造函数, 而不需要调用复制构造函数.确实如果按我理解的, 要先创建临时对象, 再调用复制构造函数, 那就太多余了.我理解的:
    CString str("haha");
    CString str="haha";应该是调用同一个构造函数。可似乎VS2005下不是这样啊。
      

  16.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
    早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
    可以使用CA2T宏转换 CString str = CA2T("haah");
    或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
    CString str="haha";
    不是调用同一个构造函数吗?为什么一个错一个不错?
      

  17.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
    早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
    可以使用CA2T宏转换 CString str = CA2T("haah");
    或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
    CString str="haha";
    不是调用同一个构造函数吗?为什么一个错一个不错?
    构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。
      

  18.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
    早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
    可以使用CA2T宏转换 CString str = CA2T("haah");
    或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
    CString str="haha";
    不是调用同一个构造函数吗?为什么一个错一个不错?
    构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。我验证下来,按照C++的语法,CString str="haha";
    这样的语句调用相应参数的构造函数,不会调用=运算符函数。
      

  19.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
    早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
    可以使用CA2T宏转换 CString str = CA2T("haah");
    或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
    CString str="haha";
    不是调用同一个构造函数吗?为什么一个错一个不错?
    构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。我验证下来,按照C++的语法,CString str="haha";
    这样的语句调用相应参数的构造函数,不会调用=运算符函数。
    不能确定每个MFC版本的CString是不是调用同个构造函数
      

  20.   


    Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
    早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
    可以使用CA2T宏转换 CString str = CA2T("haah");
    或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
    CString str="haha";
    不是调用同一个构造函数吗?为什么一个错一个不错?
    构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。我验证下来,按照C++的语法,CString str="haha";
    这样的语句调用相应参数的构造函数,不会调用=运算符函数。
    不能确定每个MFC版本的CString是不是调用同个构造函数按照C++的语法,这两个语句是不是调用同一个构造函数?