Es ist keine gute Übung, STL-Klassen in der DLL-Schnittstelle zu verwenden, wie Common practice in dealing with warning c4251: class … needs to have dll-interface erklärt. Ein Beispiel dafür ist gegeben:Eine Möglichkeit, die Warnung C4251 bei Verwendung von STL-Klassen in der DLL-Schnittstelle zu beseitigen
#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;
};
Wenn diese Datei zu kompilieren, können die folgenden Warnhinweise zu beachten:
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'
Dann ist die Frage, wie wir die gleiche Funktionalität Vektor und String ohne STL-Klasse implementieren kann. Eine Implementierung ich denken konnte, ist wie folgt:
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;
};
Wie Sie sehen können, in der neuen Implementierung wir int * p_abc verwenden Vektor abc und char * z_str zu ersetzen String str zu ersetzen. Die Frage, die ich habe, ist, ob es andere elegante Implementierungsansätze gibt, die dasselbe tun können. Vielen Dank!
Ich versuchte Ihren vierten Vorschlag, aber ich habe den C2242 Fehler, wenn sie mit VS2010 kompilieren. – Simon
Es ist schwer zu sagen, warum der Compiler mit C2242 klagt, ohne den Code oder zumindest die volle Fehlermeldung zu sehen, aber ich würde vermuten, dass irgendwo vor einem Typedef ein Semikolon fehlt. Vielleicht wurde die Zeile 'class __declspec (dllexport) HelloWorld' versehentlich kopiert? – buygrush
@Simon: verwenden Sie 'Vorlagenklasse __declspec (dllexport) Std :: basic_string;' –