【发布时间】:2011-11-18 13:45:54
【问题描述】:
我正在编写一个库函数,我确实需要能够将 vectors 和 maps 之类的参数传递给它。
我知道你不能在库的头部声明一个带有 STL 参数的函数
std::map<int> FixMap( const std::map<int> & );
由于二进制兼容性问题,除非库和可执行文件是使用相同的编译器和设置编译的。
另一方面,使用 Qt 模板库以下工作
QMap<int> FixMap( const QMap<int> & );
即使他们提供的 DLL 可能是由与我不同的编译器编译的。
Qt 使用他们的QMap、QValueList、QString 使用什么技术来克服这个兼容性问题?
我已经阅读了一些他们的代码,但我无法隔离该技术。
问题 1: 有人可以向我解释(或许通过简短的演练?)如何编写应用他们技术的代码?
我知道唯一可行的技术是将string/map 作为一个不透明指针,或者使用pImpl 成语。
问题 2: 我可以使用 STLPort 代替“本机”STL 标头来实现这种调用吗?这对 STL 的性能有何影响?
【问题讨论】:
-
您确定您的代码实际上是指预编译的二进制文件吗?通常,模板代码每次使用时总是重新编译。 (您不能“编译”模板。)
-
即使使用“qt 技术”,在使用不同的编译器/设置进行编译时也很容易遇到问题。它只是让您免于在一些情况下您可以替换共享库而无需重新编译使用它的程序