C++ 当STL类用作函数参数或返回类型时,为什么编译器不抛出警告c4251

C++ 当STL类用作函数参数或返回类型时,为什么编译器不抛出警告c4251,c++,dll,stl,C++,Dll,Stl,与警告C4251“X”相关的问题需要具有dll接口,以便由“Y”类的客户端使用,此处对此进行了详细解释: 对于我来说,在从库导出的类中使用std::string作为成员不是一个好主意的原因很清楚,这是有道理的。然而,我真的不明白,如果我使用std::string作为参数类型或返回类型,为什么这不是一个问题 class DllPort SampleClass { private: std::string privateMember; // Warning C4251 public:

与警告C4251“X”相关的问题需要具有dll接口,以便由“Y”类的客户端使用,此处对此进行了详细解释:

对于我来说,在从库导出的类中使用std::string作为成员不是一个好主意的原因很清楚,这是有道理的。然而,我真的不明白,如果我使用std::string作为参数类型或返回类型,为什么这不是一个问题

class DllPort SampleClass
{
private:
    std::string privateMember;  // Warning C4251

public:
    std::string publicMember;   // Warning C4251

    std::string publicFunction1();          // compiler says it is OK
    void publicFunction2(std::string value);// compiler says it is OK
};

我使用Visual Studio 2015。

我认为原因是
std::string
std::basic_string
的一个显式专门化。因此,它不再是一个类模板。这同样适用于所有四种情况,@RSahu。也就是说,我认为,除了有用的信息外,上述SO帖子中的答案传播了相当多的FUD。查看例如Boost,了解如何正确操作。设置起来需要更多的时间,但是你不必为了动态链接而破坏你的界面。我认为原因是
std::string
std::basic_string
的一个显式专门化。因此,它不再是一个类模板。这同样适用于所有四种情况,@RSahu。也就是说,我认为,除了有用的信息外,上述SO帖子中的答案传播了相当多的FUD。查看例如Boost,了解如何正确操作。这需要更多的设置,但是你不必为了动态链接而破坏你的界面。