Доброго дня!
Есть несколько классов в которых одна из функций формирует вектор указателей. По завершению обработки этого вектора память надо вернуть обратно, для этого каждый класс имеет функцию free принимающаю ссылку на вектор. Так как функции free отличаются только типом указателей, то я решил определить эту функции через template.
inc/librtnl_tmp.hpp: In function ‘void free(std::vector<T*, std::allocator<T*> >&)’:
inc/librtnl_tmp.hpp:5: error: expected ‘;’ before ‘tmp’
inc/librtnl_tmp.hpp:7: error: ‘tmp’ was not declared in this scope
make: *** [library] Error 1
Вопрос:
- почему возникает ошибка
- смогу ли я потом использовать эту функцию в своих классах как public-функцию и если смогу, то какие условия для этого необходимо соблюсти
Спасибо.
При обращении к квалифицированному члену шлаблона класса компилятор не может определить, относиться имя к типу, объекту или функции.
Чтобы пояснить компилятору, что подразумеваеться тип, следует подставить перед квалифицированным именем ключевое слово typename.
Я только начинаю работать с C++, поэтому не всё понял.
Итак, благодаря typename ошибка компиляции решена, теперь возникла ошибка на этапе линковки.
Что я сделал:
- подключил h-файл с template-функцией к файлу с определением своего класса в котором прописана функция free с параметрами для этого класса
- в c-файле класса закомментировал реализацию функции free
При компиляции получаю следующее:
/tmp/ccHm4VHF.o: In function `main':
main.cpp:(.text+0x1d1e): undefined reference to `RTNL_addr::free(std::vector<rtnl_addr_info_s*, std::allocator<rtnl_addr_info_s*> >&)'
main.cpp:(.text+0x22b1): undefined reference to `RTNL_addr::free(std::vector<rtnl_addr_info_s*, std::allocator<rtnl_addr_info_s*> >&)'
collect2: ld returned 1 exit status
Он хочет метод free класса RTNL_addr.
Смотри оъявление класса RTNL_add, и что написано в main.cpp
Очисти весь проект и собери все заново, может make не обновил объектные файлы по зависимости.
Если я правильно код, то Вы реализовали шаблонную функцию для конкретного класса и его потомков.
У меня классы не наследуют друг от друга, но содержат однотипную функцию которую я и хочу вынести.
Но, если я правильнопонял можно создать класс содержащий нужную мне шаблонную функцию и наследовать все остальные классы от него, верно?
UPD: Да, подход через создание класса с шаблонной функцией сработал.