Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34

Не получается создать специализацию шаблона класса

22.06.2013, 19:23. Показов 717. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста в чем ошибка. Я гуглил по кодам ошибок, но не смог понять в чем дело.

Заголовочный файл:
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 ARRAY_H
#define ARRAY_H
 
#include <iostream>
using std::istream;
using std::ostream;
 
template< typename T, int s >
class Array
{
    friend ostream& operator<<( ostream&, const Array& );
    friend istream& operator>>( istream&, Array& );
public:
    Array();
    Array( const Array& ); // конструктор копии
    ~Array();
 
    int getSize() const;
    
    //const Array& operator=( const Array& );
    bool operator==( const Array& ) const;
    bool operator!=( const Array& right ) const
    {
        return !( *this == right );
    }
    int &operator[]( int );
    int operator[]( int ) const;
private:
    int size;
    T a[ s ];
};
 
#endif
Файл реализации:
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
#include "Array.h"
 
#include <iostream>
using std::cerr;
using std::endl;
 
#include <iomanip>
using std::setw;
 
#include <cstdlib> // прототип функции exit
using std::exit;
 
template< typename T, int s >
Array<T,s>::Array()
{
    size = ( s > 0 ? s : 10 );
    for( int i = 0; i < size; i++ )
        a[ i ] = 0;
}
 
template< typename T, int s >
Array<T,s>::Array( const Array<T,s>& arrayToCopy )
    : size( arrayToCopy.size )
{
    for( int i = 0; i < size; i++ )
        a[ i ] = arrayToCopy.a[ i ];
}
 
template< typename T, int s >
Array<T,s>::~Array( void )
{
    for( int i = 0; i < size; i++ )
        a[ i ] = NULL;
}
 
template< typename T, int s >
int Array<T,s>::getSize() const 
{
    return size;
}
 
/*template< typename T, int s >
const Array<T,s>& Array<T,s>::operator=( const Array<T,s>& right )
{
    if( &right != this ) // избегает самоприсваивания
    {
        if( size != right.size ) // если размеры массивов не равны, то пересоздаем массив( левый операнд ) и его меняем его размер  
        {
            size = right.size;
            delete [] ptr;
            ptr = new int[ size ];
        }
        for( int i = 0; i < size; i++ )
            ptr[ i ] = right.ptr[ i ];
    }
    return *this; // позволяет каскадировать
}*/
 
template< typename T, int s >
bool Array<T,s>::operator==( const Array<T,s>& right ) const
{
    if( size != right.size )
        return false;
 
    for( int i = 0; i < size; i++ )
        if( a[ i ] != right.a[ i ] )
            return false;
    return true;
}
 
template< typename T, int s >
int& Array<T,s>::operator[]( int subscript )
{
    if ( subscript < 0 || subscript >= size )
    {
        cerr << "\nError: Индекс " << subscript << " вне диапазона." << endl;
        exit( 1 );
    }
    return a[ subscript ];
}
 
template< typename T, int s >
int Array<T,s>::operator[]( int subscript ) const
{
    if ( subscript < 0 || subscript >= size )
    {
        cerr << "\nError: Индекс " << subscript << " вне диапазона." << endl;
        exit( 1 );
    }
    return a[ subscript ];
}
 
template< typename T, int s >
istream& operator>>( istream& input, Array<T,s>& aa )
{
    for( int i = 0; i < aa.size; i++ )
        input >> aa.a[ i ];
    return input; // разрешает каскадирование
}
 
template< typename T, int s >
ostream& operator<<( ostream& output, const Array<T,s>& aa )
{
    int i;
    for ( i = 0; i < aa.size; i++ )
    {
        output << setw( 12 ) << aa.a[ i ];
 
        if ( ( i + 1 ) % 4 == 0 ) // по 4 числа в строке вывода
            output << endl;
    }
 
    if( i % 4 != 0 )
        output << endl;
 
    return output; // разрешает каскадирование
}
Когда в main пытаюсь создать специализацию шаблона класса, то выводит вот такие ошибки:
C++
1
2
3
4
5
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Array<char,4>::Array<char,4>(int)" (??0?$Array@D$03@@QAE@H@Z) в функции _main
 
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Array<char,4>::~Array<char,4>(void)" (??1?$Array@D$03@@QAE@XZ) в функции _main
 
1>C:\Users\Александр\Desktop\Программирование\Программы на С++ ( обучение )\MS Visual Studio проекты\p38 класс Array(шаблон)\Debug\ConsoleApplication1.exe : fatal error LNK1120: неразрешенных внешних элементов: 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <locale.h>
 
#include <iostream>
using std::cout;
using std::endl;
 
#include "Array.h"
 
int main()
{
    setlocale(LC_CTYPE,"Russian");
 
    Array < int , 4  > aa;
 
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2013, 19:23
Ответы с готовыми решениями:

Объявить специализацию шаблона класса
Добрый вечер. Есть код:// Example program #include &lt;iostream&gt; #include &lt;string&gt; constexpr uint8_t config = { 4, 0, 0,...

Не могу создать специализацию шаблона ф-ции
Добрый день! Помогите с такими вопросом, не получается создать явную специализацию шаблона , при компиляции кидает с ошибкой в шаблон т.к.,...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

2
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
22.06.2013, 19:28
Шаблон класса
1
 Аватар для WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34
22.06.2013, 19:30  [ТС]
@Kuzia domovenok, большое спасибо))) Все понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2013, 19:30
Помогаю со студенческими работами здесь

Почему я не попадаю в специализацию шаблона?
Почему я не попадаю в специализацию шаблона? template&lt;&gt; box&amp; max(box&amp;, box&amp;); #include&lt;iostream&gt; struct box { ...

Реализовать явную специализацию шаблона, принимающего ссылку на массив символов
Здравствуйте! Возникла небольшая проблема. Возникла нужда в явной специализации шаблона, принимающего ссылку на старый символьный...

Не получается создать массив класса
#include &lt;iostream&gt; using namespace::std; class dvig { friend void sum_all(dvig &amp;,dvig &amp;); public: dvig(long double ,long...

Не получается создать template для класса
Здравствуйте, делаю все, как написано в Интернете, а у меня вылетает ошибка runtime - unresolved externals. Не могу создать правильно...

Не получается создать экземпляр абстрактного класса
в общем я очень тупой, буду благодарен за умные советы, имеется класс object и наследуемые от него triangle и uravn вот фрагмент из мэйна ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
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, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru