自定义类,导出dll,stl容器vector

什么人需要看这篇文章:

自定义类myclass导出到dll,exe中需要使用vector<myclass>。

 

如果没有经验,在exe运行的你可能会碰到非法访问的错误。

怎么解决?

这是因为vector是模板类,你需要在dll中实例化vector<myclass>。

 

这里给出示例代码。

// ------------------------------------------- // MYHEADER.H //disable warnings on 255 char debug symbols #pragma warning (disable : 4786) //disable warnings on extern before template instantiation #pragma warning (disable : 4231) #include <vector> // Provide the storage class specifier (extern for an .exe file, null // for DLL) and the __declspec specifier (dllimport for .an .exe file, // dllexport for DLL). // You must define EXP_STL when compiling the DLL. // You can now use this header file in both the .exe file and DLL - a // much safer means of using common declarations than two different // header files. #ifdef EXP_STL # define DECLSPECIFIER __declspec(dllexport) # define EXPIMP_TEMPLATE #else # define DECLSPECIFIER __declspec(dllimport) # define EXPIMP_TEMPLATE extern #endif // Instantiate classes vector<int> and vector<char> // This does not create an object. It only forces the generation of all // of the members of classes vector<int> and vector<char>. It exports // them from the DLL and imports them into the .exe file. EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<int>; EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<char>; // Declare/Define a class that contains both a static and non-static // data member of an STL object. // Note that the two template instantiations above are required for // the data members to be accessible. If the instantiations above are // omitted, you may experience an access violation. // Note that since you are exporting a vector of MyClass, you must // provide implementations for the operator < and the operator ==. class DECLSPECIFIER MyClass { public: std::vector<int> VectorOfInts; static std::vector<char> StaticVectorOfChars; public: bool operator < (const MyClass > c) const { return VectorOfInts < c. VectorOfInts; } bool operator == (const MyClass > c) const { return VectorOfInts == c. VectorOfInts; } }; // Instantiate the class vector<MyClass> // This does not create an object. It only forces the generation of // all of the members of the class vector<MyClass>. It exports them // from the DLL and imports them into the .exe file. EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<MyClass>; // ------------------------------------------- // Compile options needed: /GX /LDd /MDd /D"EXP_STL" // or: /GX /LD /MD /D"EXP_STL" // DLL.CPP #include "MyHeader.h" std::vector<char> MyClass::StaticVectorOfChars; // ------------------------------------------- // Compile options needed: /GX /MDd // or: /GX /MD // EXE.CPP #include <iostream> #include "MyHeader.h" int main () { MyClass x; for (int i=0; i<5; i++) x.VectorOfInts.push_back(i); for (char j=0; j<5; j++) x.StaticVectorOfChars.push_back('a' + j); std::vector<int>::iterator vii = x.VectorOfInts.begin(); while (vii != x.VectorOfInts.end()) { std::cout << *vii; std::cout << " displayed from x.VectorOfInts" << std::endl; vii++; } std::vector<char>::iterator vci = x.StaticVectorOfChars.begin(); while (vci != x.StaticVectorOfChars.end()) { std::cout << *vci; std::cout << " displayed from MyClass::StaticVectorOfChars"; std::cout << std::endl; vci++; } std::vector<MyClass> vy; for (i=0; i=5; i++) vy.push_back(MyClass()); return 1; }

 

你可能感兴趣的:(vector,Class,dll,generation,Warnings,Instantiation)