LINUX.ORG.RU

Шаблоны C++, заголовочные файлы и раздельная компиляция


0

0

Преамбула: поскольку у меня в проекте используются С-шные библиотеки, а мне нужно кое-чего из Фортрана, решил написать минимальную плюсовую библиотеку для определения многомерных массивов в стиле Фортрана.

Да, я знаю, что решение немного черезжопное, но не ругайтесь. Вызывать С-шные программы непосредственно из Фортрана тоже еще то удовольствие, особенно с учетом того, что Фортран 77 не различает регистры, нужно добавлять подчеркивание и передавать все аргументы по ссылке, что требует написания нефигового количества оберток. А из всего Фортрана мне нужна только одна рутина, но она, сцуко, работает с массивами. Да и в сшных прогах (которые теперь стали фактически С++) приятнее работать с массивами в стиле array(i,j)=f(i,j)... Не в этом суть.

Написал я значит небольшой классик, назовем его farray, отладил вроде, но захотелось мне, чтобы элементы массива были какого угодно типа (целого, вещественного). Сказано -- сделано, наваял шаблон. Далее поступаю как обычно: определение шаблона в .h, реализацию методов в .cpp, а в "основном" файле (назовем его main.cpp) делаю
#include "farray.h"

компиляю:
g++ -Wall -g -c farray.cpp -o farray.o
g++ -Wall -g -c main.cpp -o main.o
g++ -g main.o farray.o -o main.x

Получаю:
/tmp/ccYFZtpA.o: In function `main':
~/Fortran-style-arrays/main.cc:13: undefined reference to `farray<double>::farray(unsigned int)'

Шо за нах?!

Гуглю. Предлагают решение по включению farray.cpp прямо в farray.h как "железно" работающее решение! Это что ж, братцы, выходит, перекомпилять всего этого крокодила надо? В чем выгода от раздельной компиляции, коль при пересборке main.cpp будет пересобираться все?!

ОК, гуглю дальше. Нахожу совет почитать info gcc на предмет "Template Instantiation". И вот тут загвоздка: читаю и нифига не понимаю.

Ребята, поможите, кто чем может <сами мы не местные, на вокзале все учебники C++ украли>, как сделать все "нормально"?

я пишу реализацию в другой .h и в конце "основного" хедера добавляю #include на него, чтоб не захламлять последний, насчет "перекомпилять всего этого крокодила" - для этого придумали pch

lester ★★★★
()
Ответ на: комментарий от lester

я написал так:

(в файле farray.h)
template <typename T>
  class farray
  {
     // содержимое класса
  };

#include farray.cc

Ты так же делаешь?

> "перекомпилять всего этого крокодила" - для этого придумали pch
что это такое и как его юзать?

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

> Ты так же делаешь?

да - только расширение не .сс, а .h

> что это такое и как его юзать?


любой хедер можно скомпилить в header.h.gch, так что если gcc при сборке найдет рядом с хедером такой файл, то он не будет тратить время на повторную компиляцию

http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

lester ★★★★
()
Ответ на: комментарий от lester

ОК, спасибо.

А еще такой вопрос: вот у меня данные хранятся в приватном массиве, могу я в некоторых случаях вернуть не сам указатель, а ссылку на него?

Иными словами, для фортрановских функций, которые хотят *double можно им подсунуть &(*double) вместо этого?

annoynimous ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

> хотят *double можно им подсунуть &(*double) вместо этого?

если речь идет о преобразовании аргумента из второго в первое - то конечно же

lester ★★★★
()
Ответ на: комментарий от lester

ОК, спасибо еще раз.

Завтра допишу реализацию и потестю :-)

annoynimous ★★★★★
() автор топика

> В чем выгода от раздельной компиляции, коль при пересборке main.cpp будет пересобираться все?!

Это шаблоны. Раздельная компиляция для них не работает.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.