Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 46
  1. #1

    [C++ & MFC]Problema nell'inizializzare una variabile dichiarata come CString

    Sera a tutti..
    avrei un piccolo problema.. sto facendo un applicazione MFC solo che riscontro un errore quando inizializzo una variabile dichiarata come CString...
    vi mostro un esempio banale di codice con il relativo errore per darvi l'idea di quello che mi succede..

    CString s1 = "This ";

    error C2440: 'inizializzazione': impossibile convertire da 'const char [6]' a 'ATL::CStringT<BaseType,StringTraits>'
    1> with
    1> [
    1> BaseType=wchar_t,
    1> StringTraits=StrTraitMFC<wchar_t>
    1> ]
    1> Il costruttore di class 'ATL::CStringT<BaseType,StringTraits>' è dichiarato come 'explicit'
    1> with
    1> [
    1> BaseType=wchar_t,
    1> StringTraits=StrTraitMFC<wchar_t>
    1> ]


    come posso sistemare questa cosa? dovunque legga non trovo tutti questi problemi nell'inizializzare una variabile CString ma escono a me -.-
    come fare?
    grazie per l'aiuto ..spero che mi possiate aiutare..
    buona serata

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Come puoi leggere dal compilatore, dice non può convertire da const char [6].
    E' quindi evidente che questa classe CString non possiede un costruttore di copia che possa effettuare una conversione implicita.
    O meglio, anche se ci fosse, è inibito perchè ha un costruttore di tipo explicit (cio è vuo l dire che gli puoi passare solo un'altro CString)
    Morale della favola: CString non può prendere come argomento un char*
    Devi vedere se tra i metodi della classe ci sia qualche "convertitore" del tipo
    codice:
    CString c;
    c.FromChar("Ciao");
    Ma ciò è poco probabile alrimenti sarebbe stato messo come costruttore.

    Oppure devi usare i prefissifissi. Leggi la documentazione e vedi se ne ha uno.
    Ad esempio...
    codice:
    "Ciao a tutti" // questo è un const char *
    L"Ciao a tutti" // questo è un const wchar_t*
    S"Ciao a tutti" // questo è un System::String
    Devi vedere se la classe CString ti da un prefisso in modo che restituisca direttamente un CString.

    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Rileggendo bene il tuo post ho notato che CString è una classe che utilizza alcuni template.
    In particolare, facendo io alcune prove, ho visto che...

    codice:
    typedef ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
    typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
    typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
    A me CString è dichiarata con i TCHAR, mentre a te, evidentemente, con i wchar_t.

    Ciò vuol dire che...
    [list=1][*]O invece di CString scrivi CStringA[*]Oppure nelle impostazioni di progetto metti come set di caratteri nonset (cosi potrai scrivere CString)[/list=1]

    Oppure se ti piacciono i wchar_t e vuoi continuare a usarli cambia la tua definizione, come avevo anche detto nel post precedente, da
    codice:
    CString c = "This";
    a
    codice:
    CString c = L"This";
    E provare a vedere se funziona...
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    grazie per l'aiuto ora provo e ti faccio sapere.. sperando ke vada bene


    edit:
    ho provato mettendo sia
    CStringA c="";
    sia
    CString c = L"This";

    e fungono entrambi grazie mille

  5. #5
    Un consiglio: per fare in modo che il tuo codice sia compilabile sia in ANSI che in Unicode racchiudi le stringhe nella macro _T:
    codice:
    CString test = _T("stringa");
    in tal modo non dovresti avere mai problemi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie anke a te MItaly
    uso il CStringA così è già per l'unicode
    grazie a tutti

  7. #7
    Guarda che CStringA non è unicode, ma ANSI. Ti consiglio di usare CString e _T in modo da ottenere progetti compilabili sia in ANSI che in Unicode.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    ah un' altra cosa..
    per CStringList non dovrei avere problemi come il CString giusto? o mi sbaglio?


    edit:
    non mi da problemi va tutto ok

  9. #9
    Originariamente inviato da MItaly
    Guarda che CStringA non è unicode, ma ANSI. Ti consiglio di usare CString e _T in modo da ottenere progetti compilabili sia in ANSI che in Unicode.
    mmm strano io ho controllato su MSDN e mi dice ke è per unicode.. boh
    ecco cosa dice MSDN:
    Sono adesso disponibili versioni UNICODE e ANSI di CString, ovvero CStringW e CStringA. Per contrassegnare ogni overhead non necessario causato da conversioni implicite, i costruttori che accettano il tipo inverso, ad esempio CStringA che accetta un argomento UNICODE o CStringW che accetta un argomento ANSI, vengono definiti come espliciti mediante la seguente voce in stdafx.h:#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS

  10. #10
    Se tu usi CString per le stringhe (e non CStringA, con cui forzi l'uso del template ANSI) non dovresti avere nessun problema di compatibilità con nessuna altra classe delle MFC; ribadisco, usa CString e racchiudi le stringhe con _T().
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.