Как я отмечал в другом вопросе SO, я наткнулся на эту статью. Проблема возникла, когда я скомпилировал boost 1.40 через MSVC7.1, и появилось несколько предупреждений C4251.
Теперь, после прочтения указанной статьи, я задаюсь вопросом: обычно ли не рекомендуется экспортировать код шаблона, например
class DLLEXPORT_MACRO AClass
{
public:
std::vector<int> getVecCopy() { return myVec; }
...
}
Скажем, этот код скомпилирован в DLL через MSVC7.1. Хотя этот код не вызывает ошибок при ссылке из другого кода MSVC7.1, говорится, что ссылка на эту DLL в коде MSVC8 вызывает сбои во время выполнения (проблемы с выравниванием памяти?).
Поскольку это, очевидно, плохо ... как лучше всего справиться с проблемой экспорта кода шаблона?
2 ответа
Это кажется плохой идеей, поскольку std :: vector отличается или может отличаться в разных версиях компилятора. Однако это, скорее всего, может потерпеть неудачу во время загрузки, потому что изменение имени std :: vector должно различаться в разных версиях компилятора (это часть обоснования изменения имени).
Этот сбой во время компоновки - это то, что вы, как разработчик, не можете на самом деле обеспечить, кроме как купить компиляторы, которые его поддерживают. Другое решение - полностью исключить типы шаблонов из интерфейсов DLL. Поместите их в частных участников.
Обратите внимание, что проблема не только в шаблонах. Представьте на мгновение, что std::string
- это UDT вместо typedef, предоставляемый средой выполнения компилятора. Он все еще может меняться между версиями компилятора и, конечно, между поставщиками компиляторов. Его по-прежнему нельзя было бы использовать в интерфейсе DLL.
По этим причинам практические решения: 0. используйте C, 1. используйте COM или 2. остановитесь на одной версии компилятора.
К сожалению, на самом деле нет возможности экспортировать код шаблона. Внешние библиотеки обычно просто предоставляют исходный код для любых шаблонов. Иногда у них есть шаблоны, использующие вспомогательные классы, которые не являются шаблонами, чтобы скрыть частный код. Но в принципе нет возможности сделать это.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .