Наследование шаблона
От: vlad0922  
Дата: 19.04.13 10:37
Оценка:
Добрый вечер.

Есть класс

#ifndef VECT_H
#define VECT_H

#include<iostream>

template<typename T>
class vect
{
    public:
int n;
T *array;
void create(int count);
virtual void setElement(int number, T source);
T get(int number);
};

#endif


который наследуется другим классом

#ifndef SET_HPP
#define SET_HPP

#include "vect.h"

template<typename T>
class Set : public vect<T>
{
void sort();
bool check (int element);
    public:
void setElement(int number, T source);
void print();
};

#endif


Все функции заданы в соответсвующих .cpp файлах.
При попытке выполнения такого кода

#include <iostream>

#include "set.h"

int main(int argc, char** argv) {
Set<int> t;

t.create(10);
for (int i=0;i<10;i++)
t.setElement(i,i);

t.print();

return 0;
}


Выдает ошибки:
main.cpp.text+0xc8): undefined reference to `vect<int>::create(int)'
main.cpp.text+0xed): undefined reference to `Set<int>::setElement(int, int)'
main.cpp.text+0x10f): undefined reference to `Set<int>::print()'

Можете подсказать, как их решить?
Заранее спасибо за ответ.
Re: Наследование шаблона
От: watch-maker  
Дата: 19.04.13 10:54
Оценка:
Здравствуйте, vlad0922, Вы писали:

V>Выдает ошибки:

V>main.cpp:(.text+0xc8): undefined reference to `vect<int>::create(int)'
V>main.cpp:(.text+0xed): undefined reference to `Set<int>::setElement(int, int)'
V>main.cpp:(.text+0x10f): undefined reference to `Set<int>::print()'

V>Можете подсказать, как их решить?


Написать определения методов. Где у тебя в коде тело функции create, например? Пока его не существует.
Re: Наследование шаблона
От: vlad0922  
Дата: 19.04.13 11:09
Оценка:
Дополню.
Код в файла set.cpp

#include "set.h"

template<class T>
void Set<T>::sort()
{    
try
{
if (this->n==0) throw this->n;
else
{
    int temp;

    for(int i=0; i < this->n; i++)          
        for( int j = this->n-1; j > i; j-- )   
          if ( this->array[j-1] > this->array[j] ) {
              temp=this->array[j-1];
            this->array[j-1]=this->array[j];
            this->array[j]=temp;
            }
}
}
catch (int n)
{
    std::cout<<"Array is not initialized" << std::endl;
}
}


template<class T>
bool Set<T>::check(int element)
{
try
{
if (this->n==0) throw this->n;
else
{
    for (int i=0; i<this->n;i++)
        if (element==this->array[i])
            return true;
    
    return false;
}
}
catch(int n)
{
    std::cout<<"Array is not initialized" << std::endl;
}
}

template<class T>
void Set<T>::print()
{
    try
{
if (this->n==0) throw this->n;
else
{
    for (int i=0;i<this->n;i++)
        std::cout<<this->array[i] << ' ';

    std::cout << std::endl;
    }
}
catch(int n)
{
    std::cout<<"Array is not initialized" << std::endl;
}
}

template<class T>
void Set<T>::setElement(int number, T source)
{
    try
    {
        if ( (number>=this->n) || (number<0) )
            throw number;
        else
        {
            if (check(source))
            std::cout<<"There is equal element" << std::endl;
            else
            {
            this->array[number]=source;
            sort();
            }
        }
    }
    catch (int number)
    {
        std::cout << "Wrong element number" << std::endl;
    }
}


Код в файле vect.cpp

#include "vect.h"

template<class T>
void vect<T>::create(int count)
{
    try
    {
        if (count<=0)
            throw count;
        else
            {
                n=count;
                array=new T[n];
                for (int i=0;i<n;i++)
                {
                std::cout << i;
                array[i]=0;
                }
            }
    }
    catch(int number)
    {
        std::cout << "the number of elements in the array <= 0" << std::endl;
    }    
}

template<class T>
T vect<T>::get(int number)
{
    try
    {
        if ( (number>=n) || (number<0) )
            throw number;
        else
            return array[number];
    }
    catch (int number)
    {
        std::cout << "Wrong element number" << std::endl;
    }
}
Re: Наследование шаблона
От: Mr.Delphist  
Дата: 19.04.13 11:17
Оценка:
Здравствуйте, vlad0922, Вы писали:

V>Есть класс

...
V>Все функции заданы в соответсвующих .cpp файлах.

Это шаблон, а не класс, поэтому весь код имплементации надо втащить в тот же h-файл (рисовать его in-place или пустить простынёй после описания всего шаблона — дело вкуса).
В новых версиях компиляторов идут подвижки к тому, чтобы разрешить хранение кода шаблона отдельно от объявления шаблона, но лучше пока не надо делать такое в живых проектах.
Re[2]: Наследование шаблона
От: Кодт Россия  
Дата: 19.04.13 13:31
Оценка: +1
Здравствуйте, Mr.Delphist, Вы писали:

MD>В новых версиях компиляторов идут подвижки к тому, чтобы разрешить хранение кода шаблона отдельно от объявления шаблона


Экспорт шаблонов, что ли? Эти подвижки давным-давно возникли и как-то завяли.
Перекуём баги на фичи!
Re: Наследование шаблона
От: uzhas Ниоткуда  
Дата: 19.04.13 14:35
Оценка:
Здравствуйте, vlad0922, Вы писали:

V>Все функции заданы в соответсвующих .cpp файлах.


вам нужно перетащить весь код в .h файлы, проблемы с линковкой должны решиться
с шаблонами так часто делают. простые (нешаблонные) классы можно реализовывать в .cpp
успехов
Re[2]: Наследование шаблона
От: johny5 Новая Зеландия
Дата: 20.04.13 04:25
Оценка:
Здравствуйте, uzhas, Вы писали:

U>вам нужно перетащить весь код в .h файлы, проблемы с линковкой должны решиться

U>с шаблонами так часто делают. простые (нешаблонные) классы можно реализовывать в .cpp
U>успехов

Как писк стиля: имплементации можно вытащить в отдельный хеадер .hpp и включать только там, где шаблоны используются. Либо оставить шаблоны в .cpp и сделать им явную инстанцинацию (тем самым и время компиляции резко снизить).
Re[3]: Наследование шаблона
От: Mr.Delphist  
Дата: 22.04.13 10:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Mr.Delphist, Вы писали:


MD>>В новых версиях компиляторов идут подвижки к тому, чтобы разрешить хранение кода шаблона отдельно от объявления шаблона


К>Экспорт шаблонов, что ли? Эти подвижки давным-давно возникли и как-то завяли.


Оно самое, и вроде то ли Комео, то ли ГЦЦ его даже в каком-то виде умели есть — но согласен, инициатива как-то завяла
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.