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

Не типовые параметры в шаблоне класса - C++

Восстановить пароль Регистрация
 
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
21.01.2013, 19:51     Не типовые параметры в шаблоне класса #1
Начал изучать шаблоны и вроде все было хорошо, но в задании с использованием в шаблоне не типового параметра встал... вот что получилось...

описание класса в .h файле
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
#ifndef ARRAY1_H
#define ARRAY1_H
 
#include <iostream>
#include <locale.h>
using namespace std;
 
template<class ElementType, int numberOfElements>
class Array
{
    friend wostream& operator<<(wostream &, const Array<ElementType, numberOfElements> &);
    friend wistream& operator>>(wistream &, const Array<ElementType, numberOfElements> &);
 
    public:
        Array();
        Array(const Array &);
        ~Array();
        int getSize() const;
        const Array& operator=(const Array &);
 
        ElementType operator==(const Array &) const;
        ElementType operator!=(const Array &) const;
        ElementType &operator[](int);
        static int getArrayCount();
 
    private:
        ElementType *ptr;
        int size;
 
        static int ArrayCount;
};
 
#endif ARRAY1_H
затем файл с реализацией класса .cpp соответственно
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "stdafx.h"
#include "Array1.h"
#include <iostream>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <locale.h>
using namespace std;
 
template<class ElementType, int numberOfElements>
int Array<ElementType, numberOfElements>::ArrayCount = 0;
 
template<class ElementType, int numberOfElements>
Array<ElementType, numberOfElements>::Array()
{
    ++ArrayCount;
    size = numberOfElements;
    ptr = new ElementType[size];
    assert(ptr != 0);           //завершение если память не выделена
 
    for(int i = 0; i < size; i++)
        ptr[i] = 0;                 //присвоение начальных значений
}
 
template<class ElementType, int numberOfElements>
Array<ElementType, numberOfElements>::Array(const Array &init)
{
    ++ArrayCount;
    size = init.size;
    ptr = new ElementType[size];
    assert(ptr != 0);           //завершение если память не выделена
 
    for(int i = 0; i < size; i++)
        ptr[i] = init.ptr[i];                   //копирование init в объект
}
 
template<class ElementType, int numberOfElements>
Array<ElementType, numberOfElements>::~Array()
{
    --ArrayCount;
    delete []ptr;
}
 
template<class ElementType, int numberOfElements>
int Array<ElementType, numberOfElements>::getSize() const {return size;}
 
template<class ElementType, int numberOfElements>
const Array<ElementType, numberOfElements>& Array<ElementType, numberOfElements>::operator=(const Array &right)
{
    if(&right != this)
    {
        delete []ptr;
        size = right.size;
        ptr = new ElementType[size];
        assert(ptr != 0);
 
        for(int i = 0; i < size; i++)
            ptr[i] = right.ptr[i];
    }
 
    return *this;               //позволяет = y = z
}
 
template<class ElementType, int numberOfElements>
ElementType Array<ElementType, numberOfElements>::operator ==(const Array &right) const
{
    if(size != right.size)
        return 0;
 
    for(int i = 0; i < size; i++)
        if(ptr[i] != right.ptr[i])
            return 0;
 
    return 1;
}
 
template<class ElementType, int numberOfElements>
ElementType Array<ElementType, numberOfElements>::operator !=(const Array &right) const
{
    if(size != right.size)
        return 1;
 
    for(int i = 0; i < size; i++)
        if(ptr[i] != right.ptr[i])
            return 1;
 
    return 0;
}
 
template<class ElementType, int numberOfElements>
ElementType &Array<ElementType, numberOfElements>::operator [](int subscript)
{
    assert(0 <= subscript && subscript < size);
 
    return ptr[subscript];
}
 
template<class ElementType, int numberOfElements>
int Array<ElementType, numberOfElements>::getArrayCount() {return ArrayCount;}
 
template<class ElementType, int numberOfElements>
wistream& operator>>(wistream &inpyt, const Array<ElementType, numberOfElements> &a)
{
    for(int i = 0; i < a.getSize(); i++)
        inpyt >> a.ptr[i];
 
    return inpyt;       //позволяет cin >> x >> y
}
 
template<class ElementType, int numberOfElements>
wostream& operator<<(wostream &outpyt, const Array<ElementType, numberOfElements> &a)
{
    for(int i = 0; i < a.getSize(); i++)
    {
        outpyt << a.ptr[i] << ' ';
    }
 
    return outpyt;      //позволяет cout << x << y
}
и уже в мейне
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// peregruzka.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "Array1.h"
#include <iostream>
#include <string.h>
#include <assert.h>
#include <locale.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    wcout << L"Количество созданных массивов: " 
        << Array<int, 0>::getArrayCount() << "\n\n";
 
    return 0;
}
И при вызове первой же функции выдает ошибку типа:
C++
1
 unresolved external symbol "public: static int __cdecl Array<int,0>::getArrayCount(void)" (?getArrayCount@?$Array@H$0A@@@SAHXZ) referenced in function _wmain
думаю что не правильно что-то в объявлении, но не могу понять что не так объявил... первый день с шаблонами... заранее благодарю за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2013, 19:51     Не типовые параметры в шаблоне класса
Посмотрите здесь:

C++ перегрузка + в шаблоне класса.
C++ Перегрузка операторов в шаблоне класса
Как потоковую функцию в шаблоне класса сделать неинлайновой C++
Вызов функции в шаблоне класса C++
C++ Перегрузка << в шаблоне класса List
Структура в шаблоне класса C++
Ошибка в шаблоне класса (вывод в поток) C++
C++ Перегрузка операций ввода/вывода в шаблоне класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
21.01.2013, 19:59     Не типовые параметры в шаблоне класса #2
Реализация шаблонного класса должна находится в хедере, потому что при компиляции Array1.cpp неизвестно, что понадобится специализация для Array<int, 0>.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
21.01.2013, 20:08  [ТС]     Не типовые параметры в шаблоне класса #3
Schizorb, спасибо, в книги даже не было написано про это...
Yandex
Объявления
21.01.2013, 20:08     Не типовые параметры в шаблоне класса
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru