Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
#1

пространство имен для шаблонного класса - C++

19.04.2012, 21:12. Просмотров 370. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
template<class T> class BaseClass {
    T data;
void show();
}
Подскажите пожалуйста как написать тело функции.
Если я неясно выразился, то имеется ввиду, что без шаблона это выглядит так BaseClass::методы_класса, а с шаблоном не понятно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2012, 21:12     пространство имен для шаблонного класса
Посмотрите здесь:
Включение класса в пространство имен C++
Можно ли прятать методы класса в пространство имен? C++
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? C++
Вызов метода у шаблонного поля, шаблонного класса C++
Перегрузка << , >> для шаблонного класса C++
итератор для шаблонного класса C++
Перегрузка operator<< для шаблонного класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
19.04.2012, 21:44     пространство имен для шаблонного класса #2
Если ты имеешь в виду описание метода, то
C++
1
2
3
4
template <class T>
void BaseClass<T>::show()
{
}
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
20.04.2012, 00:35  [ТС]     пространство имен для шаблонного класса #3
блин не ставил <T> во 2ой строке...

Добавлено через 2 часа 0 минут
А конструкторы нужно для каждого типа специлиализировать?
Сделал вот такую вещь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
class BaseMatr {
    private:
        T **m;
        int n;
 
    public:
        class Rep;// row, col;
        Rep *row;
        BaseMatr();
        BaseMatr(int n);
        BaseMatr(const BaseMatr<T>&);
        BaseMatr operator= (const BaseMatr<T> &bm);
        ~BaseMatr();
        void Show();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
template<typename T> BaseMatr<T>::BaseMatr() {
    m = new T*[1];
    m[0] = new T[1];
    n = 1;
}
template <typename T> BaseMatr<T>::~BaseMatr() {
    for(int i=0;i<n;i++)
        delete [] m[i];
    delete [] m;
}
 
template<typename T>BaseMatr<T>::BaseMatr(int pn) {
    m = new T*[pn];
    for(int i=0;i<pn;i++)
        m[i] = new T[pn];
    n = pn;
}
 
template<typename T>BaseMatr<T>::BaseMatr(const BaseMatr<T> &bm) {
    m = new float*[bm.n];
    n = bm.n;
    for(int i=0;i<bm.n;i++) {
        m[i] = new T[bm.n];
        std::copy(bm.m[i], bm.m[i]+n, m[i]);
    }
}
 
template<typename T> BaseMatr<T> BaseMatr<T>::operator=(const BaseMatr<T> &bm) {
    if (this==&bm) return *this;
 
    for(int i=0;i<n;i++)
        delete [] m[i];
    delete [] m;
 
    n = bm.n;
 
    m = new T*[n];
    for(int i=0;i<n;i++) {
        m[i] = new T[n];
        std::copy(bm.m[i], bm.m[i]+n, m[i]);
    }
    return *this;
};
 
template<typename T> void BaseMatr<T>::Show() {
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++)
            std::cout<<m[i][j]<<"\t";
        std::cout<<endl;
    }
    std::cout<<endl;
}
когда объявляю BaseMatr<float> m;
пишет:
[ILINK32 Error] Error: Unresolved external 'BaseMatr<float>::BaseMatr<float>()' referenced from ...
[ILINK32 Error] Error: Unresolved external 'BaseMatr<float>::~BaseMatr<float>()' referenced from ...
Heretiqu3
10 / 10 / 2
Регистрация: 19.04.2012
Сообщений: 20
20.04.2012, 00:50     пространство имен для шаблонного класса #4
Реализация шаблонного класса должна быть в том же файле или подключаться через #include

template <T>
class A;

#include файл с телами функций.

BaseMatr(const BaseMatr<T>&);
template<typename T> BaseMatr<T> BaseMatr<T>::operator=(const BaseMatr<T> &bm) {
указывать тут <T> не надо.
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
20.04.2012, 01:00  [ТС]     пространство имен для шаблонного класса #5
все подключается через include просто здесь не написанно
Heretiqu3
10 / 10 / 2
Регистрация: 19.04.2012
Сообщений: 20
20.04.2012, 01:24     пространство имен для шаблонного класса #6
Цитата Сообщение от besh]<a Посмотреть сообщение
все подключается через include просто здесь не написанно
Не может быть, где-то ошибка, так как линкер не может найти реализацию конструктора и деструктора, не там подключаете значит

Добавлено через 18 минут
Не могу редактировать сообщения, так что отдельный пост.
Удалите все же лишние <T>

А оператор присваивания я бы немного переписал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename T> 
BaseMatr<T> & BaseMatr<T>::operator=(const BaseMatr & bm) 
{
    if (this != &bm)
    {
 
        BaseMatr::~BaseMatr();
 
        n = bm.n;
 
        m = new T*[n];
        for(int i=0;i<n;i++) {
            m[i] = new T[n];
            std::copy(bm.m[i], bm.m[i]+n, m[i]);
        }
    }
    return * this;
}
А по-хорошему, там обьект существует и создавать новый может быть совсем не обязательно, сделать проверку, хватает ли памяти и записывать туда, при наличии оной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 03:01     пространство имен для шаблонного класса
Еще ссылки по теме:
C++ Перегрузка оператора -> для шаблонного класса
C++ Как для шаблонного класса определить действие для частного случая
Несколько типов данных для шаблонного класса C++
Перегрузить приведение типов для шаблонного класса C++
Как перегрузить операторы для шаблонного класса? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
20.04.2012, 03:01  [ТС]     пространство имен для шаблонного класса #7
Хм, не думал что можно так вот деструктор использовать, и условие ненужное убрано. Интересно, спасибо =)

В общем это как то странно. В билдере всегда создавал unit(.h+.cpp) и в другие модули добавлял только h-файл и все работало. А сейчас надо оба подключать. Работает.
Yandex
Объявления
20.04.2012, 03:01     пространство имен для шаблонного класса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru