|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
[Visual C++] Errore nel linker
Ciao, ho questo pezzo di codice:
Codice:
std::string config; std::wstring tmp; getline(conf_file, config); tmp=string_wstring(config); MessageBoxW(NULL, tmp.c_str(), L"Testo", MB_OK); Codice:
std::wstring string_wstring(std::string input) { std::wstring output(sizeof(input), L''); std::copy(input.begin(), input.end(), output.begin()); return output; } Codice:
Programma.obj : error LNK2005: "class std::basic_string,class std::allocator > __cdecl string_wstring(class std::basic_string,class std::allocator >)" (?string_wstring@@YA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) già definito in stdafx.obj Da qualche parte avevo letto di forzare il linker a definire più volte la classe, ma vorrei trovare una soluzione migliore. Cosa posso fare? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Hai dimenticato qualche #pragma once in testa ad un header?
Comunque per convertire da string a wstring dovresti usare mbstowcs |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Quote:
Come funziona? Mi sono accorto ora che ho bisogno pure della conversione da wstring a string. Questo mbstowcs può sempre essere utile? |
||
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Essendo funzioni C lavorano su array e si usano in 2 fasi, nella prima si richiede la dimensione che dovrà avere il buffer di uscita, e nella seconda viene eseguita la conversione: Codice:
string original; int requiredSize = mbstowcs(NULL, original.c_str(), 0); char dest[requiredSize]; mbstowcs(dest, original.c_str(), requiredSize); |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12815
|
Che orrore
![]() |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Piuttosto quello che mi serve è una soluzione per il problema del linker. Idee? ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12815
|
Hai ragione perdonami ma un linguaggio che ha 400 tipi di dato mi fa quest'effetto
![]() error LNK2005: "class std::basic_string,class std::allocator > __cdecl string_wstring(class std::basic_string,class std::allocator >)" (?string_wstring@@YA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) già definito in stdafx.obj Neanche fosse C offuscato. Cmq prometto solennemente di non interferire più. Chiedo scusa a tutti. Ultima modifica di WarDuck : 02-03-2010 alle 23:27. |
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Certo che se le usi per convertire solo caratteri ascii allora torna tutto. Hai provato con stringhe veramente wide char? Quote:
Il fatto che la ritrovi duplicata in stdafx.obj mi fa sospettare di questa opzione. |
||
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
![]() Non mi servono stringhe wide char. Mi serve solo la conversione di testo semplice per poterlo poi passare a MessageBox. |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Altrimenti puoi usare solo wstring (wcout ecc...) e per le stringhe costanti dichiararle facendole precedere da L |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Non funziona ._.
Mi sa tanto che mi tengo i warning... Ultima modifica di MrModd : 04-03-2010 alle 13:15. |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
![]() EDIT: Tra l'altro sempre VS mi dice che è sconsigliato l'uso di mbstowcs e raccomanda invece mbstowcs_s. Ma ho visto che cambiano i parametri della chiamata di funzione... Ultima modifica di MrModd : 04-03-2010 alle 13:28. |
|
![]() |
![]() |
![]() |
#13 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Prova con vector: Codice:
string original; int requiredSize = mbstowcs(NULL, original.c_str(), 0); vector<wchar_t>dest(requiredSize); mbstowcs(&dest[0], original.c_str(), requiredSize); wstring output(dest.begin(), dest.end()); Quote:
|
||
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Ah quindi dici che si possono ancora usare le funzioni "deprecated"?
Nel frattempo avevo usato un modo alternativo che usava la funzione raccomandata, ma c'era sempre quel problema della dichiarazione di array. Nel mio programma molto spesso ricevevo uno stack overflow per via della dimensione troppo piccola dell'array creato. Questo è il codice: Codice:
std::wstring string_wstring(std::string input) { size_t origsize = strlen(input.c_str())+1; const size_t newsize = 10000; size_t convertedChars = 0; wchar_t output[newsize]; mbstowcs_s(&convertedChars, output, origsize, input.c_str(), _TRUNCATE); return output; } std::string wstring_string(std::wstring input) { const size_t newsize = 10000; size_t convertedChars = 0; char output[newsize]; wcstombs_s(&convertedChars, output, origsize, input.c_str(), _TRUNCATE); return output; } EDIT: Non mi riconosce il comando vector... Ultima modifica di MrModd : 04-03-2010 alle 17:47. |
![]() |
![]() |
![]() |
#15 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
e using namespace std; o std::vector |
||
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
![]() ![]() ![]() ![]() Quanto mi mandano in bestia gli errori sui tipi di variabili!!!!! Con vector non funziona perchè mbstowcs_s vuole un wchar_t* mentre vede in ingresso un std::vector<_Ty>. Mi sa che mi tengo la soluzione del copy(), è la più semplice. |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Devi passare l'indirizzo del primo elemento: &dest[0] La soluzione copy è sbagliata. E comunque se non ti servono i caratteri unicode perchè non modifichi le impostazioni del progetto come ti avevo suggerito? |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Questo è il codice che ho fin'ora: Codice:
std::wstring string_wstring(std::string input) { size_t origsize = strlen(input.c_str())+1; size_t convertedChars = 0; std::vector<wchar_t>output(origsize); mbstowcs_s(&convertedChars, &output[0], origsize, input.c_str(), _TRUNCATE); return output; } impossibile convertire il parametro 1 da 'std::vector<_Ty>' a 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it' Ultima modifica di MrModd : 05-03-2010 alle 15:02. |
|
![]() |
![]() |
![]() |
#19 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Devi prima costruire la wstring a partire dal vector. L'esempio completo te l'avevo già postato prima. E poi perchè mai stai usando le funzioni non standard di Microsoft? Comunque ripeto se cambi le impostazioni di progetto non hai bisogno di questi metodi. |
||
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
![]() Perché dici funzioni non standard? A dire il vero sto facendo di tutto per mantenermi il più possibile entro i limiti dello standard C++. Ho usato la libreria fstream. EDIT: Aspetta, cosa intendi per modificare le impostazioni del progetto? PS. Tra l'altro, non essendo abituato al Visual C++, non riesco a trovare dove poter definire quello che mi avevi detto nelle proprietà del progetto... Dove va messo??? EDIT2: Ora è perfetta la conversione *_* Prima avevo problemi con alcuni caratteri tipo le lettere accentate, ora non più. Ecco il codice: Codice:
//Converte una variabile da string a wstring std::wstring string_wstring(std::string input) { size_t origsize = strlen(input.c_str())+1; size_t convertedChars = 0; std::vector<wchar_t>vec(origsize); mbstowcs_s(&convertedChars, &vec[0], origsize, input.c_str(), _TRUNCATE); std::wstring output(vec.begin(), (vec.end()-1)); return output; } //Converte una variabile da wstring a string std::string wstring_string(std::wstring input) { size_t origsize = wcslen(input.c_str())+1; size_t convertedChars = 0; std::vector<char>vec(origsize); wcstombs_s(&convertedChars, &vec[0], origsize, input.c_str(), _TRUNCATE); std::string output(vec.begin(), (vec.end()-1)); return output; } Ultima modifica di MrModd : 05-03-2010 alle 16:21. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:06.