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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ivan101
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 4
#1

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

18.03.2013, 20:53. Просмотров 837. Ответов 8
Метки нет (Все метки)

Здравствуйте,
помогите пожалуйста понять в чем ошибка, пытаюсь написать шаблон класса векторов, но получаю следующее:
Код
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++):

Объявление класса с шаблоном - C++
Пишу в Qt. Создал класс с шаблоном matrix.h #ifndef MATRIX_H #define MATRIX_H template &lt;class T&gt; class Matrix {

Работа с шаблоном класса - C++
Приветствую. Есть задание: 1. Создать шаблон заданного класса. Определить конструкторы, деструктор, перегруженную операцию присваивания...

Работа с шаблоном класса Vector - C++
Я недавно начала интересоваться программированием на С++, но для меня это достаточно сложно. Вот написала прогу, в которой надо создать...

Маленький косяк с шаблоном класса - C++
Задание: Разработать шаблонный класс для работы с очередью. Должны быть реализованы операции включения и выборки значений из очереди....

В чем разница между классом и шаблоном класса? - C++
Помогите ответить. В чем разница между классом и шаблоном класса?

Зачем пишется имя класса перед шаблоном? - C++
#include &lt;iostream&gt; template &lt;typename T&gt; class Grid { public: Grid(int mWidth = kDefaultWidth, int mHeight =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
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
Модератор
Эксперт CЭксперт С++
13135 / 7398 / 828
Регистрация: 27.09.2012
Сообщений: 18,234
Записей в блоге: 3
Завершенные тесты: 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;
}
Спасибо за ответы!

Не могли бы Вы еще ответить на другой интересующий вопрос?
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
18.03.2013, 22:02 #9
Причина, почему не получается в разных файлах следующая:
Если шаблонов нет, то функции компилируются и получается объектный код,
который сборщик может использовать.
При наличии шаблонов объектный код создать нельзя, т.к. неизвестна реализация, а
компилятор только проверяет правильность кода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 22:02
Привет! Вот еще темы с ответами:

Проблемы с использованием класса - C++
Задача Водителям не безразличен пробег их авто. Один водитель записал свои данные о нескольких заправках, записывая пройденные км и число...

Ошибка с шаблоном - C++
Собсно,только начал изучать шаблоны,кажется,что-то упустил,ну в общем вот: #include &lt;iostream&gt; using namespace std; ...

Бинарное дерево с шаблоном - C++
Пишу бинарное дерево типа BST&lt;Key, Value&gt;. Значениями хочу сделать любые типы данных. По-этому пришол к шаблонам, но с реализацией не...

Error C4430 с шаблоном - C++
Доброго времени суток. Не могу разобраться, в чем проблема. Хелп :) Выдаёт ошибку source.cpp(27): error C4430: missing type specifier...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.03.2013, 22:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru