std :: stringstream类需要有dll接口

我有一个DLL内的C ++类。

在那个类中,我想将一个Curlcallback的数据存储到一个成员variables中。 我打算使用像这样的stringstream

void MyClass::CurlCallback( void * pvData, size_t tSize ) { const char* data = static_cast<const char*>(pvData); m_myStringStream << sata; } 

但是当在我的类中声明stringstream时如此:

 private: std::stringstream m_myStringStream; 

我得到以下错误:

 Error 1 error C2220: warning treated as error - no 'object' file generated Warning 2 warning C4251: 'MyClass::MyClass::m_myStringStream' : class 'std::basic_stringstream<_Elem,_Traits,_Alloc>' needs to have dll-interface to be used by clients of class 'MyClass::MyClass' 

我怎样才能声明这个stringstream没有得到这个错误?

我认为这是因为stringstream是一个C ++variables,但DLL期待C风格的variables。

我调查也许创build一个存储XML数据的类如下所示:

  class XMLData { public: XMLData(); virtual ~ XMLData(); const char* GetXMLData() const { return xml; } void Append( const char* xmlData ) { /*add xmlData to xml blah blah*/}; private: //Add more here - to do char* xml; int length; }; 

并宣布:

  XMLData* m_xmlData; 

做这个的最好方式是什么??

首先,你会收到一个警告,你选择在项目设置中威胁所有警告,比如错误。

DLL导出的类不应该在其导出的接口中声明复杂的类型(如STL模板),因为它将DLL的使用限制在相同版本的编译器中。 这就是为什么你得到警告。

要解决这个问题,你应该只导出一个接口类(即纯抽象类)并返回接口的实现。

喜欢这个:

 //in the interface: class DLL_API IMyClass { public: virtual void set(const char* data)=0; virtual const char* get()=0; } //now not in the interface: class CMyClass : public IMyClass { private: std::stringstream mystream; public: virtual void set(const char* data){ mystream<<data; } virtual const char* get(){ return mystream.str().c_str(); } } 

而且你只使用DLL之外的引用或指针,如果你需要在可执行文件中创建对象,那么在DLL中需要一个工厂方法,因为它只知道接口。

 IMyClass* ObjectFactory::GetMyClass() { return new CMyClass(); }