¹ Версии компилятора Intel для Linux до 9.0 использовали опцию - strict_ansi
Табл. 1.40. Опции, указывающие расположение реализаций шаблонов
Инструментарий | Сценарий |
Comeau | -template_directory=<path> |
Intel (Linux) | -export_dir<path> |
Например, предположим, что вы хотите скомпилировать программу, показанную в примере 1.27. Она содержит три файла.
• Файл plus.hpp содержит объявление экспортируемого шаблона функции plus()
.
• Файл plus.cpp содержит определение plus()
.
• Файл test.cpp включает объявление — но не определение — plus()
и определяет функцию main()
, использующую plus()
.
Пример 1.27. Простая программа, использующая экспортируемые шаблоны
plus.hpp:
#ifndef PLUS_HPP_INCLUDED
#define PLUS_HPP_INCLUDED
export template<typename T>
T plus(const T& lhs, const T& rhs);
#endif // #ifndef PLUS_HPP_INCLUDED
plus.cpp:
#include 'plus.hpp'
template<typename T>
T plus(const T& lhs, const T& rhs) {
return rhs + lhs;
}
test.cpp:
#include <iostream>
#include 'plus.hpp'
int main() {
std::cout << '2 + 2 = ' << plus(2, 2) << '
';
}
Чтобы скомпилировать plus.cpp в объектный файл plus.obj с помощью Comeau в Unix, перейдите в директорию, содержащую plus.cpp, plus.hpp и test.cpp, и введите следующую команду.
$ como -c --export plus.cpp
Эта команда также генерирует файл plus.et, описывающий реализацию шаблона, содержащегося в plus.cpp.
Для развлечения откройте plus.et в текстовом редакторе.
Затем скомпилируйте test.cpp в объектный файл test.obj с помощью команды:
$ como -c --export test.cpp
Наконец, скомпонуйте исполняемый файл test.exe.
$ como --export -о test test.obj
Две последние команды также можно объединить в одну.
$ como --export -o test test.cpp
Теперь можно запустить test.exe.
$ ./test
2 + 2 = 4
Теперь предположите, что файлы plus.hpp и plus.cpp находятся в директории с именем plus, a test.cpp находится в дочерней директории test. Чтобы скомпилировать и скомпоновать test.cpp, перейдите в директорию test и введите:
$ como --export --template_directory=../plus -I../plus -o test
test.cpp
Обсуждение C++ поддерживает две модели обеспечения определений шаблонов функций и статических данных- членов шаблонов классов: включающую (inclusion model) и раздельную (separation model) модели. Включающая модель знакома всем программистам, регулярно использующим шаблоны С++, но часто оказывается непонятной программистам, привыкшим писать код без шаблонов. Во включающей модели определение шаблона функции — или статических данных-членов шаблона класса — должно включаться в каждый исходный файл, ее использующий. В противоположность этому при использовании нешаблонных функций и данных достаточно включить в исходный файл только объявление; определение может быть помещено в отдельный файл .cpp.
Раздельная модель ближе к традиционной манере организации исходного кода C++. Для шаблонов, объявленных с ключевым словом export
, не требуется включать определения во все исходные файлы, их использующие. Вместо этого определения помещаются в отдельные файлы .cpp. Однако параллель с традиционной организацией кода не полная, так как даже несмотря на то, что код, использующий экспортируемый шаблон, не требует включения его определения, он зависит от определения.
Раздельная модель предлагает несколько потенциальных преимуществ.