【问题标题】:std::stringstream class needs to have dll-interfacestd::stringstream 类需要有 dll 接口
【发布时间】:2014-10-02 09:43:08
【问题描述】:

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

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

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

    m_myStringStream << sata;
}

但是当像这样在我的类中声明字符串流时:

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;

最好的方法是什么??

【问题讨论】:

  • 假设您在 MyClass 类上标记了一个 declspec(dllexport) 属性,因为这将解释此消息。您的假设是错误的(std::stringstreamtype;不是变量)。您的类是从您的 DLL 中导出的(并通过推断其成员)。如果你愿意,你可以旋转一个粉刺来抵消这种情况(看起来你这样做了)。这是this question 的副本,顺便说一句。

标签: c++ c windows dll stringstream


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2018-12-03
    • 2016-09-10
    • 2011-01-19
    • 2017-07-18
    • 2010-09-24
    相关资源
    最近更新 更多