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

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

Восстановить пароль Регистрация
 
WindSlasher
 Аватар для WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34
22.06.2013, 19:23     Не получается создать специализацию шаблона класса #1
Подскажите пожалуйста в чем ошибка. Я гуглил по кодам ошибок, но не смог понять в чем дело.

Заголовочный файл:
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2013, 19:23     Не получается создать специализацию шаблона класса
Посмотрите здесь:

C++ при перезагрузке оператора для класса не получается использовать имя переменной такое же,как в описании класса
C++ Определение метода-шаблона за пределами шаблона класса
Не получается создать массив класса C++
Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
Явное создание экземпляра класса и явная специализация шаблона класса C++
Не получается создать template для класса C++
C++ Не получается создать объект унаследованный от абстрактного класса
Не могу создать специализацию шаблона ф-ции C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.06.2013, 19:28     Не получается создать специализацию шаблона класса #2
Шаблон класса
WindSlasher
 Аватар для WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34
22.06.2013, 19:30  [ТС]     Не получается создать специализацию шаблона класса #3
@Kuzia domovenok, большое спасибо))) Все понял.
Yandex
Объявления
22.06.2013, 19:30     Не получается создать специализацию шаблона класса
Ответ Создать тему
Опции темы

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