реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема с шаблонном класса с наследованием., Ошибка линкера
kurtis
сообщение Nov 14 2008, 17:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Здравствуйте! 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

Если убрать описание шаблона, то проект собирается без ошибок.
В каком месте я допустил ошибку?
Заранее спасибо за помощь!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 14 2008, 17:34
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kurtis
сообщение Nov 14 2008, 17:42
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



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

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

Только теперь непонятно, как (где) тело методов описывать? Ведь в .h файле, код как-то не очень красиво смотрится, а подключать .cpp файл тоже не очень красиво...
Go to the top of the page
 
+Quote Post
shreck
сообщение Nov 17 2008, 06:19
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(kurtis @ Nov 15 2008, 00:42) *
Спасибо, теперь все нормально! biggrin.gif

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

Пишите раелизацию в отдельном файле, но включите его с помощью #include в самом конце .h файла, где находится описание шаблона.
З.Ы. Писать определения функций шаблонного класса в .h файле совершенно нормальное явление. См., например, STL.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 17 2008, 09:21
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



[/quote]Писать определения функций шаблонного класса в .h файле совершенно нормальное явление.[quote]

Стоит заметить, что на сегодняшний день и единственно возможное.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 01:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016