Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115

Использование шаблона класса

06.01.2013, 13:55. Показов 1037. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
у меня возникла проблемка при использовании шаблона класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class X> class CArray
{
public:
    X *myarray;
    int nsize;
    int ncapacity;
 
    CArray(){nsize=0;
    ncapacity=0;};
    void Init();
    void AddElement(X _element);
}
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
template <class X> 
void CArray<X>::AddElement(X _element)
{
    if (nsize!=ncapacity)
    {
        for (int i=0;i<ncapacity;i++)
        {
            if (myarray[i]==0)
            {
                myarray[i]=_element;
                break;
            }
        }
        nsize++;
    }
    else
    {
        cout<<"Full"<<endl;
    }
}
 
template <class X>
void CArray<X>::Init()
{
    for (int i=0;i<ncapacity;i++)
    {
        myarray[i]=0;
    }
}
C++
1
2
3
4
5
6
7
8
9
int main()
{
    CArray<double> arr1;
    arr1.ncapacity=3;
    arr1.nsize=0;
    arr1.Init();
    arr1.AddElement(4.6);
    return 0;
}
myarray - динамический массив.
При компиляции вываливаются ошибки:
1.error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall CArray<double>::AddElement(double)" (?AddElement@?$CArray@N@@QAEXN@Z) в функции _main
2. error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall CArray<double>::Init(void)" (?Init@?$CArray@N@@QAEXXZ) в функции _main

Подскажите, пожалуйста, из-за чего валятся такие ошибки?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2013, 13:55
Ответы с готовыми решениями:

Использование шаблона класса
Предположим есть два класса A0, A1 (A0-&gt;A1) . То есть, A1 потомок А0. Также есть класс, описывающий обьект, хранящий обьекты типа А0,...

Использование конструктора класса-шаблона
Есть функция, которая принимает шаблон класса, но при попытке использовать конструктор возникает ошибка, как быть?

Использование операторов шаблона класса
Приветствую, уважаемые форумчане. Я - начинающий программист, во время чтения книги Ст. Липмана &quot;Язык программирования вводный...

13
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.01.2013, 14:01
Во-первых, не вижу точки с запятой в конце объявления класса. Во-вторых, для шаблонов классов объявление и реализация должны быть в одном файле.
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
06.01.2013, 14:08  [ТС]
перекинул в хедер описание шаблонных функций. Теперь вываливает ошибку про нарушение прав доступа при записи в строке
C++
1
 myarray[i]=0;
Функции Init().
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.01.2013, 14:11
А, собственно, память где-нибудь выделяется?
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
06.01.2013, 14:21  [ТС]
эм. уже разобрался)) сорри за панику))
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
06.01.2013, 14:37
помоему в gcc у меня реализация шаблонов хранится отдельно и как бы всё работает.а хранить всё одном файле некрасиво.

Добавлено через 47 секунд
интересно, что говорит об этом стандарт C++
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
06.01.2013, 14:41  [ТС]
согласен, не красиво, но если функции описаны в сурсе, а не в хедере внутри шаблонного класса, то вываливаются ошибки((
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.01.2013, 14:47
Шаблоны инстанцируются на этапе компиляции, следовательно, определения должны быть доступны. Есть такая вещь как экспорт шаблонов, но с реализацией в компиляторах все печально.
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
06.01.2013, 15:06  [ТС]
появился вопрос - как ограничить тип данных для используемого класса.. например, хочется, чтобы этот шаблон класса мог использоваться только для int и float.?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.01.2013, 15:24
Сразу же вопрос: зачем? Что кошмарного произойдет если шаблон будет инстанцирован для какого-либо другого подходящего типа?

Добавлено через 9 минут
C++11, конечно, позволяет реализовать, но что-то мне подсказывает, что ТС такое решение не подойдет.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <type_traits>
 
template <class T>
class Shell
{
public:
    Shell();
private:
    T data_;
};
 
template<class T>
Shell<T>::Shell() : data_()
{
    static_assert(std::is_same<T, int>::value || std::is_same<T, float>::value,
        "T must be int or float");
}
 
int main()
{
    Shell<double> n;
    return 0;
}
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
06.01.2013, 15:25  [ТС]
ну вот хочется))
почитал литературу.. оказывается не так просто это сделать.. придется переопределять каждую функцию под конкретный тип?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.01.2013, 15:27
На предыдущей странице добавил пример с использованием static_assert.
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
06.01.2013, 15:27  [ТС]
спасибо)
0
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
09.01.2013, 17:57  [ТС]
Здравствуйте)
У меня возникла проблемка со специализацией шаблона.
Хочется, чтобы не только для int и double работала функция SortArray(), но и для char*.
Собственно, задачка та же.
Функция SortArray() описана в хедере в классе, в котором используется шаблон.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void SortArray()
    {
        X nTemp=NULL;
        for (int ii=0;ii<m_nsize;ii++)
        {
            for (int ij=0;ij<m_nsize;ij++)
            {
                if (myarray[ii]<myarray[ij])
                {
                    nTemp=myarray[ii];
                    myarray[ii]=myarray[ij];
                    myarray[ij]=nTemp;
                }
            }
        }
    };
Собственно, если я внутри класса пишу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void SortArray<char*>()
    {
        qsort(myarray,nsize,sizeof(char*),compare)
    }
    int compare()
    {
        int i=0;
        if  (strcmp((*(char**)a),(*(char**)b))>0) 
        {
            return 1;
        }
}
То у меня вываливаются ошибки - ругается на то, что такая функция уже объявлена и то, что "<>" поставлены неверно.
Почитал литературу, там примеры только для отдельных функций были((
Помогите, пожалуйста, разобраться со специализацией шаблона.

Добавлено через 1 час 49 минут
Эм.. Подскажите плиз

Добавлено через 31 минуту
Всем спасибо за внимание, разобрался сам..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2013, 17:57
Помогаю со студенческими работами здесь

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { ...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Использование шаблона
Доброго времени суток. Использую шаблон для создания класса(реализация стека) + перегружаю несколько операторов: #include...

Использование шаблона template
Попытался использовать шаблон template в функции, но при смене типа переменной появляются проблемы с остальными функциями. Можно ли...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru