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

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

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

использование шаблонов - C++

09.04.2012, 23:17. Просмотров 606. Ответов 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
#include <iostream>
#include <vector>
 
using namespace std;
 
template <class T>
void input (vector<T>& arr);
 
int main()
{
 vector<int> arr;
 input(arr);
 
 cin.get();
 return 0;
}
 
 
template <class T>
void input (vector<T>& arr)
{
 T x = 0;
 int i = 0;
 while (cin >> x)
  {
    if (i == arr.size())
      arr.resize((arr.size() * 2) + 1);
    arr[i++] = x;
  }
 arr.resize(i);
}
все ОК, все работает...

теперь я хочу создать заголовочный файл с объявлением и отдельно реализацию

inp.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef _INPUT_H_
#define _INPUT_H_
 
#include <iostream>
#include <vector>
using namespace std;
 
template <class T>
void input (vector<T>& arr);
#endif
inp.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "inp.h"
#include <vector>
#include <iostream>
using namespace std;
 
template <class T>
void input (vector<T>& arr)
{
 T x = 0;
 int i;
 while (cin >> x)
  {
    if (i == arr.size())
      arr.resize = ((arr.size() * 2) + 1);
    arr[i++] = x;
  }
 arr.resize(i);
}
ну и собственно main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include "inp.h"
using namespace std;
 
int main()
{
 vector<int> arr;
 input(arr);
 
 cin.get();
 return 0;
}
выдает мне вот такую ошибку:

1>inputTempl.obj : error LNK2019: unresolved external symbol "void __cdecl input<int>(class std::vector<int,class std::allocator<int> > &)" (??$input@H@@YAXAAV?$vector@HV?$allocator@H@std@@@std@@@Z) referenced in function _main
1>D:\programming\templates\input\Debug\input.exe : fatal error LNK1120: 1 unresolved externals

Добавлено через 10 часов 56 минут
кто-нибудь может подсказать????
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 23:17     использование шаблонов
Посмотрите здесь:

Использование функций шаблонов - C++
Ребят помогите. надо для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода и вывода массива а также...

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

использование функций-шаблонов - C++
для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода и вывода массива, а также для решения основной...

Использование функций-шаблонов - C++
Для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода и вывода массива, и также шаблон для решения...

использование шаблонов функций в с++ - C++
После си только начал изучение с++, так вот программа просто выводит минимум из двух чисел, компилятор выдает ошибку call of overloaded...

Задача на использование шаблонов - C++
Здравствуйте, ребята! Помогите, пожалуйста с задачкой на C++. Вот само задание: Для работы с двумерными массивами арифметических типов...

Использование функций-шаблонов - C++
На уроке преподаватель не объясняет как решать. Задачи берутся из &quot;Основы программирования на языке С++&quot; часть 2 Огнева М.В., Кудрина Е.В....

Использование функций шаблонов - C++
Использование функций шаблонов: для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода массива, а также...

Не тривиальное использование шаблонов - C++
Столкнулся со следующей проблемой: предположим что у нас есть простой шаблонный класс template &lt;class Type&gt; class Test { ...

C++, использование функций шаблонов. - C++
Помогите с задачей: Подсчитать среднее арифметическое ненулевых элементов, расположенных под побочной диагональю. Вот моя наработка,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
10.04.2012, 01:07     использование шаблонов #2
Шаблонный класс не выйдет разделить на заголовок и содержимое. Опишите тела функций в заголовочном файле.
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 03:46     использование шаблонов #3
1. подключить определение шаблона к той единице компиляции, где он используется. то есть добавить в main.cpp:
C++
1
#include "inp.cpp"

2. экспортировать шаблон:
C++
1
2
3
4
5
6
7
8
9
10
#ifndef _INPUT_H_
#define _INPUT_H_
 
#include <iostream>
#include <vector>
using namespace std;
 
export template <class T>
void input (vector<T>& arr);
#endif
но на вашем компиляторе (vs2005/8/10) не прокатит, т.к. ключевое слово export не реализовано


3. инстанцировать шаблон ручками:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "inp.h"
#include <vector>
#include <iostream>
using namespace std;
 
template <class T>
void input (vector<T>& arr)
{
 T x = 0;
 int i;
 while (cin >> x)
  {
    if (i == arr.size())
      arr.resize = ((arr.size() * 2) + 1);
    arr[i++] = x;
  }
 arr.resize(i);
}
 
template void input<vector<int> >(vector<int>&);
из минусов: данный способ - отличная возможность прострелить себе ногу(с), так что использовать его надо с умом.





причина ошибки:
компиляция в общем виде происходит следующим макаром.
1. main.cpp - компилятор находит шаблонную функцию input но не может её инстанцировать, т.к. тупо "не видит" тела функции, полагая, что где-нибудь оно есть, оставляет заглушку полагаясь на совесть линковщика, мол он найдёт необходимое в других единицах компиляции и подставит вызов на место заглушки.
2. inp.cpp - компилятор видит шаблон функции, но тут он не знает, что в main.cpp необходим вызов её с шаблонным параметром int, следовательно шаблон остаётся не инстанцированным
3. линковщик находит заглушку но не находит чем её заткнуть, делаеть ему нечего кроме как поругать пользователя:
inputTempl.obj : error LNK2019: unresolved external symbol "void __cdecl input<int>(class std::vector<int,class std::allocator<int> > &)" (??$input@H@@YAXAAV?$vector@HV?$allocator@H@std@@@std@@@Z) referenced in function _main
Yandex
Объявления
10.04.2012, 03:46     использование шаблонов
Ответ Создать тему
Опции темы

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