Non è una buona pratica usare le classi stl nell'interfaccia dll come spiega Common practice in dealing with warning c4251: class … needs to have dll-interface. Un esempio è dato:Un modo per eliminare l'avviso C4251 quando si usano le classi stl nell'interfaccia dll
#include <iostream>
#include <string>
#include <vector>
class __declspec(dllexport) HelloWorld
{
public:
HelloWorld()
{
abc.resize(5);
for(int i=0; i<5; i++)
abc[i] = i*10;
str="hello the world";
}
~HelloWorld()
{
}
std::vector<int> abc;
std::string str;
};
Quando si compila questo file, le seguenti avvertenze si possono osservare:
warning C4251: 'HelloWorld::str' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'HelloWorld'
warning C4251: 'HelloWorld::abc' : class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'HelloWorld'
Allora la domanda è: come possiamo implementare la stessa funzionalità senza utilizzare classe STL vettoriale e stringa. Un'implementazione ho potuto pensare è la seguente:
class __declspec(dllexport) HelloWorld2
{
public:
HelloWorld2()
{
abc_len = 5;
p_abc = new int [abc_len];
for(int i=0; i<abc_len; i++)
p_abc[i] = i*10;
std::string temp_str("hello_the_world");
str_len = temp_str.size();
p_str = new char[str_len+1];
strcpy(p_str,temp_str.c_str());
}
~HelloWorld2()
{
delete []p_abc;
delete []p_str;
}
int *p_abc;
int abc_len;
char *p_str;
int str_len;
};
Come si può vedere, nella nuova implementazione usiamo int * p_abc per sostituire vettore abc e char * p_str per sostituire string str. La domanda che ho è se ci sono altri eleganti approcci di implementazione che possono fare lo stesso. Grazie!
Ho provato il tuo 4 ° suggerimento, ma ottengo l'errore C2242 durante la compilazione con VS2010. – Simon
È difficile dire, perché il compilatore si lamenta con C2242 senza vedere il codice o almeno il messaggio di errore completo, ma suppongo che probabilmente c'è un punto e virgola da qualche parte prima di un typedef. Forse la riga 'class __declspec (dllexport) HelloWorld' è stata copiata per caso? – buygrush
@Simon: utilizzare questa classe di modello '__declspec (dllexport) std :: basic_string;' –