在导出包含stl类的类与Visual Studio警告C4251有关的几个问题之前:例如,这个问题或这个问题。我已经阅读了UnknownRoad的优秀解释。
包装所有这些std类并导出这些也不是真正的选择。毕竟它被称为标准模板库...也就是说,我们想要提供一个与这些标准类的接口。
如何在我的dll界面中使用stl-classes?
发布于 2018-05-17 17:41:01
这可以包括相同编译器的不同版本,甚至不同的补丁级别:
我如何在我的dll界面中使用stl-classes?
标准定义了每个STL类需要提供的方法和数据成员,并定义了这些方法要做的事情; 但没有更多。特别是,该标准没有指定编译器编写者应该如何实现标准定义的功能。编译器编写者可以自由提供一个STL类的实现,该类可以添加标准中未列出的成员函数和成员变量,只要标准中定义的那些成员仍然存在并执行标准所说的内容即可。
所述basic_string类在标准中定义为具有某些成员函数和变量。标准中的实际定义差不多是4页,但这只是其中的一小部分:
namespace std {
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string {
[snip]
public:
// 21.3.3 capacity:
size_type size() const;
size_type length() const;
size_type max_size() const;
void resize(size_type n, charT c);
void resize(size_type n);
size_type capacity() const;
void reserve(size_type res_arg = 0);
void clear();
bool empty() const;
[snip]
};
事实上,同一编译器的不同版本甚至补丁级别可能会改变这些实现细节。你不能依靠他们。所以,MSVC 10的实现可能如下所示:
namespace std {
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string {
[snip]
char* m_pTheString;
};
size_t basic_string::size() const { return strlen(m_pTheString;) }
带有SP1的MSVC 10可能如下所示:
namespace std {
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string {
[snip]
vector<char> m_TheString;
};
size_t basic_string::size() const { return m_TheString.size(); }
现在说你使用MSVC10来编写一个导出这个类的DLL:
class MyGizmo
{
public:
std::string name_;
};
https://stackoverflow.com/questions/-100003349
复制相似问题