Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 4
1

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

18.03.2013, 20:53. Просмотров 1376. Ответов 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2013, 20:53
Ответы с готовыми решениями:

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

Объявление класса с шаблоном
Пишу в Qt. Создал класс с шаблоном matrix.h #ifndef MATRIX_H #define MATRIX_H template...

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

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

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

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

Л. Аммерааль
"Компилятор должен одновременно "видеть" как определения, так и вызовы шаблонов.
Это делает шаблоны плохими кандидатами на раздельную компиляцию; вместо этого мы, как правило, помещаем шаблоны в файлы заголовка."
1
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;
}
0
126 / 124 / 16
Регистрация: 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) {
...
}
1
Don't worry, be happy
16972 / 9853 / 1897
Регистрация: 27.09.2012
Сообщений: 24,431
Записей в блоге: 1
18.03.2013, 21:57 7
Исходный код шаблона должен быть доступен во время компиляции, поэтому нельзя отдельно скомпилировать шаблонные плюхи.
0
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;
}
Спасибо за ответы!

Не могли бы Вы еще ответить на другой интересующий вопрос?
0
Модератор
Эксперт С++
10456 / 8710 / 5261
Регистрация: 18.12.2011
Сообщений: 23,262
18.03.2013, 22:02 9
Причина, почему не получается в разных файлах следующая:
Если шаблонов нет, то функции компилируются и получается объектный код,
который сборщик может использовать.
При наличии шаблонов объектный код создать нельзя, т.к. неизвестна реализация, а
компилятор только проверяет правильность кода.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2013, 22:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

Проблемы с шаблоном yoo_tasty
собственно сам сайт http://hydro-doctor.com/ Проблема №1: откуда берется этот кусок свободного...

Проблемы с шаблоном DLE
Здравие всем форумчанам, возникли траблы с шаблоном. Написал свой шаблон на html. Вроде настроил...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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