std :: stringstream类需要有dll-interface

时间:2014-10-02 09:43:08

标签: c++ c windows dll stringstream

我在dll中有一个C ++类。

在该类中,我想将Curl回调中的数据存储到成员变量中。 我打算像这样使用字符串流:

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是一个C ++变量,但是dll期待c样式变量。

我调查过可能会创建一个存储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;

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

首先,您收到警告,您选择威胁所有警告,例如项目设置中的错误。

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();
}