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

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

Войти
Регистрация
Восстановить пароль
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
#1

Template - C++

19.04.2013, 21:51. Просмотров 473. Ответов 12
Метки нет (Все метки)

Доброго всем времени суток. Скажите, если я написал в хидере класса
C++
1
2
3
4
5
template <typename T>
class matrix
{
//-------
}
что писать в файле cpp этого класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 21:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Template (C++):

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier - C++
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

'MyQueue' : use of class template requires template argument list - C++
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

В чем различие template <typename T> от template <class T> ? - C++
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Ошибка компиляции: template-id does not match any template declaration - C++
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает - C++
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...

12
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
19.04.2013, 21:54 #2
вы написали явно мало, поэтому судить о том, что можно писать в сурсе еще рано.

Цитата Сообщение от metaluga145 Посмотреть сообщение
emplate <typename T>
и тут помарочка.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 21:55  [ТС] #3
Afflicted, спасибо, исправил
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.04.2013, 21:56 #4
template class - это не класс, а шаблон, по которому классы изготавливаются (инстанциируются). Чтобы изготовить класс по шаблону, необходимо иметь его полное определение в том месте, где он инстанциируется (в месте применения). Отсюда мораль - в .cpp не писать ничего, и вообще его не делать, всё оставить в заголовке, чтобы всё было доступно везде, где подключен заголовок.
0
Silvestr1994
27 / 27 / 1
Регистрация: 26.10.2012
Сообщений: 101
19.04.2013, 21:56 #5
пример:
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
//h file
//Vector.h
#include <iostream>
#include <Windows.h>
#include <climits>
#include <vector>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <math.h>
/////////////////////////////////////////////////////
using namespace std;
/////////////////////////////////////////////////////
template<class Type>
//---------------------------------------------------
class Vector
{
private:
    int count;
    Type *vec;
    Type *vec_buffer;
 
public:
    void show();
    void operator+=(int var);
    Vector();
    ~Vector();
};
#include "Vector.cpp"
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
//cpp
//Vector.cpp
#include "Vector.h"
///////////////////////////////////////////
template<class Type>
void Vector<Type>::operator+=(int var)
{
    count++;
    vec_buffer = new int[count];
    for(unsigned int i = 0;i < count;i++)
    {
        if(i == count-1)
        {
            vec_buffer[i] = var;
        }
        else
        {
            vec_buffer[i] = vec[i];
        }
    }
    delete [] vec;
    vec = new int[count];
    for(unsigned int i = 0; i < count;i++)
    {
        vec[i] = vec_buffer[i];
    }
}
///////////////////////////////////////////
template<class Type>
void Vector<Type>::show()
{
    for(unsigned int i = 0; i < count;i++)
    {
        cout<<vec[i]<<" ";
    }
}
//----------------------------------------
template<class Type>
Vector<Type>::Vector()
{
    count = 0;
    vec = new int[1];
}
template<class Type>
Vector<Type>::~Vector()
{
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//main
//main.cpp
#include "Vector.h"
 
 
int main()
{
    Vector<int> test;
    int a = 5;
    test+=a;
    test+=6;
    test+=7;
    test+=20;
    test.show();
    return 0;
}
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 21:59  [ТС] #6
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
class matrix
{
public:
    matrix();//конструктор по умолчанию
    matrix(const int& , const int& , const int&);//конструктор, создает еденичную матрицу
    matrix(const int& , const int& , const T *array, const int&);//конструктор, берет значения из массива
    matrix::matrix(matrix &);//конструктор копирования
    ~matrix();//деструктор
 
protected:
    T *array;//массив матрицы
    int rows, columns;//количество столбцов и строк
    int precision;//точность вывода матрицы
 
public:
//операции с матрицей
    matrix& set(const T* );//функция изминения значения всех элементов матрицы
    matrix& eye();//делает матрицу еденичной(возможно не квадратной)
    matrix& zero();//делает матрицу нулевой
    matrix  transpose();//функция траспонирования, возвращает матрицу
//операторы
    matrix  operator*(const matrix& );//оператор умножения матриц
    matrix  operator*(const &T);//оператор умножение на дабл
    matrix  operator+(const matrix& );//оператор сложения матриц
    matrix  operator-(const matrix& );//оператор вычитания матриц
    matrix& operator=(const matrix& );//оператор присваивания
    T&      operator()(const int&, const int&);//оператор получения элемента матрицы
//дополнительные функции
    void householderDecomposition(matrix& Q, matrix& R);//алгоритм Хаусхолдера, изменяет параметры-ссылки
//функции установок параметров матрицы
    void output();//вывод матрицы на экран
    void output(std::ofstream* );//вывод матрицы в файл
    void SetSize (const int&, const int&);//изменение размеров
    int& Columns (void);//вывод количества столбцов
    int& Rows (void);//вывод количества строк
    void SetPrecison (const int &);//установка точности вывода
};
Добавлено через 2 минуты
Nick Alte, как-то не хорошо выходит. Код становится очень некрасивым... Неужели нету другого метода?
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
19.04.2013, 22:00 #7
Например, так

C++
1
2
3
4
5
6
7
8
9
template<typename T>
class matrix
{
   public:
      matrix(T* a, T b)
      {
         a = new T[b];
      }
}

Не по теме:

ого, пока чай наливал уже исписали всю тему.

0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 22:06  [ТС] #8
Я тут немножко погуглил. Вроде вот так вот пишут люди
http://www.codeproject.com/Articles/...h-file-and-imp

Кто хорошо все это понимает, подскажите можно ли так?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
19.04.2013, 22:11 #9
metaluga145, 1 метод - просто инстанцирование конкретных типов для нормальной линковки.
2 метод - простое подключение .cpp файла. Не логичен.
3 метод - тоже самое, что советовали уже тут.
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.04.2013, 22:12 #10
Если хочешь использовать шаблоны с произвольными типами они должны быть доступны целиком. Если хочешь реализовать шаблон только для нескольких заранее известных типов, можно вынести явную инстанциацию шаблона в отдельный .cpp-файл.
0
Fedorys
19.04.2013, 22:14
  #11

Не по теме:

Цитата Сообщение от metaluga145 Посмотреть сообщение
Кто хорошо все это понимает, подскажите можно ли так?
А вот интересно, почему тому что написано по указанной вами ссылке одними людьми вы не верите, а людям, которые пишут на этом форуме вы как будто бы доверяете, хотя не знаете ни тех, ни этих?

0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 22:23  [ТС] #12
ForEveR, почему подключение файла-не логично?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
19.04.2013, 22:43 #13
metaluga145, Подключение исходного кода в клиентском коде не логично, потому что интерфейс в идеале должен бы быть полон или в документации должно быть указано, что без включения файла реализации линковаться не будет.
1
19.04.2013, 22:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 22:43
Привет! Вот еще темы с ответами:

Friend template class with template class argument - C++
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Не пойму конструкцию template <template <class T> class X> - C++
Что это за шаблон такой?

template - C++
#include &lt;iostream&gt; #include &lt;string&gt; template &lt;class T, class S&gt; void foo(const T&amp; a, const S&amp; b) { ...

Template - C++
Пишу на VS10. Имеется 3 файла: List.h #ifndef LIST_H #define LIST_H //DEList


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

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

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