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

Проблемы с шаблоном класса - C++

Восстановить пароль Регистрация
 
Ivan101
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 4
18.03.2013, 20:53     Проблемы с шаблоном класса #1
Здравствуйте,
помогите пожалуйста понять в чем ошибка, пытаюсь написать шаблон класса векторов, но получаю следующее:
Код
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Array1_D<double>::~Array1_D<double>(void)" (??1?$Array1_D@N@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Array1_D<int>::~Array1_D<int>(void)" (??1?$Array1_D@H@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Array1_D<int>::printArray1_D(void)" (?printArray1_D@?$Array1_D@H@@QAEXXZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int & __thiscall Array1_D<int>::operator[](int)" (??A?$Array1_D@H@@QAEAAHH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Array1_D<int>::Array1_D<int>(int)" (??0?$Array1_D@H@@QAE@H@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: class Array1_D<double> & __thiscall Array1_D<double>::operator=(class Array1_D<double> &)" (??4?$Array1_D@N@@QAEAAV0@AAV0@@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: class Array1_D<double> & __thiscall Array1_D<double>::operator+(class Array1_D<double> &)" (??H?$Array1_D@N@@QAEAAV0@AAV0@@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Array1_D<double>::printArray1_D(void)" (?printArray1_D@?$Array1_D@N@@QAEXXZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: double & __thiscall Array1_D<double>::operator[](int)" (??A?$Array1_D@N@@QAEAANH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Array1_D<double>::Array1_D<double>(int)" (??0?$Array1_D@N@@QAE@H@Z) в функции _main
1>C:\Users\Vladimir\Documents\Visual Studio 2010\Projects\matrix\Debug\matrix.exe : fatal error LNK1120: 10 неразрешенных внешних элементов
сам код:


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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef _MATRIX_H
#define _MATRIX_H
#include <iostream>
using namespace std;
template <class T> class Array1_D
{
private:
    T *variable;
    int size;
public:
    Array1_D();
    Array1_D(int size_of_array);
    Array1_D(const Array1_D &);
    ~Array1_D();
    void setSizeOfArray1_D(int size_of_array);
    void printArray1_D();
    friend bool operator ==(Array1_D &,Array1_D &);
    friend bool operator != (Array1_D &, Array1_D &);
    T &operator [](int i);
    Array1_D &operator+(Array1_D &);
    Array1_D &operator=(Array1_D &);
};
#endif
 
#include "matrix.h"
template <class T>
Array1_D<T>::Array1_D():size(0){
    variable=new T [size];
}
 
template <class T>
Array1_D<T>::Array1_D(int size_of_array)
{
    size=size_of_array;
    variable = new T [size];
}
 
template <class T> 
Array1_D<T>::Array1_D(const Array1_D &anotherArray)
{
    size=anotherArray.size;
    for (int i=0;i<size;i++)
        variable[i]=anotherArray.variable[i];
    }
 
template <class T>
Array1_D<T>::~Array1_D()
{
    delete []variable;
    
}
 
template <class T> 
void Array1_D<T>::setSizeOfArray1_D(int size_of_array)
{
    this->size=size_of_array;
    this->variable=new T [size];
}
 
template <class T> 
void Array1_D<T>::printArray1_D()
{
    for(int i=0;i<size;i++)
        cout<<variable[i]<<endl;
}
 
template <class T> 
T &Array1_D<T>::operator[](int i)
{
    return (variable[i]);
}
 
 
template <class T> 
Array1_D<T> &Array1_D<T>::operator= (Array1_D &anotherArray1_D)
{
    for(int i=0;i<size;i++)
    {
        this->variable[i]=anotherArray1_D.variable[i];
    }
 
    return *this;
 
}
 
template <class T> 
Array1_D<T> &Array1_D<T>::operator+(Array1_D &anotherArray1_D)
{
    Array1_D *temp=new Array1_D;
    temp->setSizeOfArray1_D(this->size);
    for(int i=0;i<size;i++)
        temp->variable[i]=this->variable[i]+anotherArray1_D.variable[i];
    return *temp;
}
 
template <class T>
bool  operator==(Array1_D<T> &one,Array1_D<T> &two)
{
    if(one.size==two.size)
        return true;
    else 
        return false;
 
}
 
template <class T> 
bool operator!=(Array1_D<T> &one,Array1_D<T> &two)
{
    return !(one.size==two.size);
}
 
int main()
{
    Array1_D<double> p(3);
    Array1_D <double> r(3);
    for(int i=0;i<3;i++)
    {
        p[i]=1.0;
        r[i]=2.0;
    }
    p.printArray1_D();
    Array1_D <double> k(3);
    k=p+r;
    k.printArray1_D();
    p.printArray1_D();
 
 
    Array1_D<int> s(10);
    for(int i=0;i<10;i++)
    {
        s[i]=i;
    }
 
    s.printArray1_D();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2013, 20:53     Проблемы с шаблоном класса
Посмотрите здесь:

C++ работа с шаблоном класса Vector
C++ Сортировка массива с шаблоном
C++ Проблемы с использованием класса
C++ Объявление класса с шаблоном
C++ Маленький косяк с шаблоном класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pi_X_el
Заблокирован
18.03.2013, 20:55     Проблемы с шаблоном класса #2
Напишите все в одном файле и ошибок не будет
Ivan101
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 4
18.03.2013, 21:00  [ТС]     Проблемы с шаблоном класса #3
Спасибо, помогло, только почему так происходит?
pi_X_el
Заблокирован
18.03.2013, 21:17     Проблемы с шаблоном класса #4
Если честно, то я не знаю почему так надо делать. Хотя уже сталкивался с этим.

Добавлено через 4 минуты
вот нашел:

Л. Аммерааль
"Компилятор должен одновременно "видеть" как определения, так и вызовы шаблонов.
Это делает шаблоны плохими кандидатами на раздельную компиляцию; вместо этого мы, как правило, помещаем шаблоны в файлы заголовка."
Ivan101
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 4
18.03.2013, 21:21  [ТС]     Проблемы с шаблоном класса #5
большое спасибо!
А можно еще вопрос:
при перегрузки оператора сложения я создаю объект оператором new, а затем передаю ссылку на него, но при этом память я никак не освобождаю, как это можно исправить? вот код:
C++
1
2
3
4
5
6
7
8
9
template <class T> 
Array1_D<T> &Array1_D<T>::operator+(Array1_D &anotherArray1_D)
{
Array1_D *temp=new Array1_D;
temp->setSizeOfArray1_D(this->size);
for(int i=0;i<size;i++)
temp->variable[i]=this->variable[i]+anotherArray1_D.variable[i];
return *temp;
}
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
18.03.2013, 21:22     Проблемы с шаблоном класса #6
шаблоны похожи на встраиваемые в плане области видимости, т.е. они не доступны из другой единицы компиляции. Можно в заголовочном файле объявить шаблон, а в .cpp определить и указать, что функция является экспортируемой (доступна из других единиц компиляции).
Например

C++
1
2
3
4
5
6
7
8
9
10
11
// 1.h
template(class T)
int f(T value);
 
// 1.cpp
#include "1.h"
 
export template(class T)
int f(T value) {
...
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11801 / 6780 / 765
Регистрация: 27.09.2012
Сообщений: 16,833
Записей в блоге: 2
Завершенные тесты: 1
18.03.2013, 21:57     Проблемы с шаблоном класса #7
Исходный код шаблона должен быть доступен во время компиляции, поэтому нельзя отдельно скомпилировать шаблонные плюхи.
Ivan101
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 4
18.03.2013, 21:58  [ТС]     Проблемы с шаблоном класса #8
Цитата Сообщение от Ivan101 Посмотреть сообщение
большое спасибо!
А можно еще вопрос:
при перегрузки оператора сложения я создаю объект оператором new, а затем передаю ссылку на него, но при этом память я никак не освобождаю, как это можно исправить? вот код:
C++
1
2
3
4
5
6
7
8
9
template <class T> 
Array1_D<T> &Array1_D<T>::operator+(Array1_D &anotherArray1_D)
{
Array1_D *temp=new Array1_D;
temp->setSizeOfArray1_D(this->size);
for(int i=0;i<size;i++)
temp->variable[i]=this->variable[i]+anotherArray1_D.variable[i];
return *temp;
}
Спасибо за ответы!

Не могли бы Вы еще ответить на другой интересующий вопрос?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 22:02     Проблемы с шаблоном класса
Еще ссылки по теме:

Ошибка с шаблоном C++
C++ В чем разница между классом и шаблоном класса?
Поиск по файле за шаблоном C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
18.03.2013, 22:02     Проблемы с шаблоном класса #9
Причина, почему не получается в разных файлах следующая:
Если шаблонов нет, то функции компилируются и получается объектный код,
который сборщик может использовать.
При наличии шаблонов объектный код создать нельзя, т.к. неизвестна реализация, а
компилятор только проверяет правильность кода.
Yandex
Объявления
18.03.2013, 22:02     Проблемы с шаблоном класса
Ответ Создать тему
Опции темы

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