Как можно передать контейнеры Qt в качестве параметров функциям совместно используемой библиотеки? - PullRequest
2 голосов
/ 18 ноября 2011

Я пишу библиотечную функцию, и мне действительно нужно иметь возможность передавать ей аргументы типа 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?

1 Ответ

0 голосов
/ 18 ноября 2011

Первый пример так же хорош, как и второй, даже если библиотека была построена с использованием другого компилятора, чем тот, который вы используете. Важно то, что двоичный интерфейс приложения , или сокращенно ABI, одинаков как для вашей программы, так и для библиотеки.

Qt не использует ничего особенного при сборке своих библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...