Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с шаблонном класса с наследованием.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
kurtis
Здравствуйте! smile.gif
Возникла небольшая проблем с наследованием и шаблоном.
Использую WinAVR версии 20080610.
Есть базовый класс
Код
//Файл TechObj.h
class TechObj
{
    private:
        //...
    public:
        //...
        virtual void drv( ) = 0;
        virtual void show_lcd( ) = 0;
        virtual void show_mnem( ) = 0;
        //...
        TechObj( ) {};
        virtual ~TechObj() {};
};

есть производный класс, с шаблоном (описан в отдельном файле, куда подключается заголовок с базовым классом)
Код
//Файл Dev_vzk.h
#include <TechObj.h>
//...
template < uint8_t NumOfClapans >
class VZK: public TechObj
{
    private:
        uint8_t someFoo[NumOfClapans ];
    public:
        //...
        void drv();
        void show_mnem();
        void show_lcd();
        //...
        VZK( ... ) { ... };
        virtual ~VZK() {};
};

методы класса VZK описаны следующим образом
Код
//Файл Dev_vzk.cpp
#include <Dev_vzk.h>
//...
template < uint8_t NumOfClapans >
void VZK<NumOfClapans>::drv()
{
    //...
}

далее, в отдельном файле объявляется объект класса VZK (файл Devs.cpp)
Код
VZK <2> KV71 ( ... );

Всю эту чудо-писанину компилятор с удовольствием переваривает, но линкер говорит свое категорическое "Error 1"
Цитата
obj/Devs.o:(.rodata._ZTV3VZKILh2EE+0x4): undefined reference to `VZK<(unsigned char)2>::drv()'
obj/Devs.o:(.rodata._ZTV3VZKILh2EE+0x6): undefined reference to `VZK<(unsigned char)2>::show_lcd()'
obj/Devs.o:(.rodata._ZTV3VZKILh2EE+0x8): undefined reference to `VZK<(unsigned char)2>::show_mnem()'
make.exe: *** [exe/Project.elf] Error 1

Если убрать описание шаблона, то проект собирается без ошибок.
В каком месте я допустил ошибку?
Заранее спасибо за помощь!
Сергей Борщ
Цитата(kurtis @ Nov 14 2008, 19:23) *
В каком месте я допустил ошибку?
Шаблоны - они как inline-функции. Их тело должно быть видно в точке инстанцирования. В данном случае точка инстанцирования - место, где вы объявляете KV71. Именно там компилятор строит vtbl. Перенесите шаблоны из .cpp в .h и все должно получиться.
kurtis
Цитата(Сергей Борщ @ Nov 14 2008, 21:34) *
Шаблоны - они как inline-функции. Их тело должно быть видно в точке инстанцирования. В данном случае точка инстанцирования - место, где вы объявляете KV71. Именно там компилятор строит vtbl. Перенесите шаблоны из .cpp в .h и все должно получиться.

Спасибо, теперь все нормально! biggrin.gif

Только теперь непонятно, как (где) тело методов описывать? Ведь в .h файле, код как-то не очень красиво смотрится, а подключать .cpp файл тоже не очень красиво...
shreck
Цитата(kurtis @ Nov 15 2008, 00:42) *
Спасибо, теперь все нормально! biggrin.gif

Только теперь непонятно, как (где) тело методов описывать? Ведь в .h файле, код как-то не очень красиво смотрится, а подключать .cpp файл тоже не очень красиво...

Пишите раелизацию в отдельном файле, но включите его с помощью #include в самом конце .h файла, где находится описание шаблона.
З.Ы. Писать определения функций шаблонного класса в .h файле совершенно нормальное явление. См., например, STL.
sergeeff
[/quote]Писать определения функций шаблонного класса в .h файле совершенно нормальное явление.[quote]

Стоит заметить, что на сегодняшний день и единственно возможное.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.