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

Template - C++

Восстановить пароль Регистрация
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 21:51     Template #1
Доброго всем времени суток. Скажите, если я написал в хидере класса
C++
1
2
3
4
5
template <typename T>
class matrix
{
//-------
}
что писать в файле cpp этого класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 21:51     Template
Посмотрите здесь:

C++ template
Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier C++
C++ Template
C++ MSVC и template template classes
C++ Не пойму конструкцию template <template <class T> class X>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
19.04.2013, 21:54     Template #2
вы написали явно мало, поэтому судить о том, что можно писать в сурсе еще рано.

Цитата Сообщение от metaluga145 Посмотреть сообщение
emplate <typename T>
и тут помарочка.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 21:55  [ТС]     Template #3
Afflicted, спасибо, исправил
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
19.04.2013, 21:56     Template #4
template class - это не класс, а шаблон, по которому классы изготавливаются (инстанциируются). Чтобы изготовить класс по шаблону, необходимо иметь его полное определение в том месте, где он инстанциируется (в месте применения). Отсюда мораль - в .cpp не писать ничего, и вообще его не делать, всё оставить в заголовке, чтобы всё было доступно везде, где подключен заголовок.
Silvestr1994
 Аватар для Silvestr1994
27 / 27 / 1
Регистрация: 26.10.2012
Сообщений: 101
19.04.2013, 21:56     Template #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;
}
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 21:59  [ТС]     Template #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, как-то не хорошо выходит. Код становится очень некрасивым... Неужели нету другого метода?
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
19.04.2013, 22:00     Template #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];
      }
}

Не по теме:

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

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

Кто хорошо все это понимает, подскажите можно ли так?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2013, 22:11     Template #9
metaluga145, 1 метод - просто инстанцирование конкретных типов для нормальной линковки.
2 метод - простое подключение .cpp файла. Не логичен.
3 метод - тоже самое, что советовали уже тут.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
19.04.2013, 22:12     Template #10
Если хочешь использовать шаблоны с произвольными типами они должны быть доступны целиком. Если хочешь реализовать шаблон только для нескольких заранее известных типов, можно вынести явную инстанциацию шаблона в отдельный .cpp-файл.
Fedorys
19.04.2013, 22:14
  #11

Не по теме:

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

metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.04.2013, 22:23  [ТС]     Template #12
ForEveR, почему подключение файла-не логично?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 22:43     Template
Еще ссылки по теме:

Ошибка компиляции: template-id does not match any template declaration C++
Template C++
'MyQueue' : use of class template requires template argument list C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2013, 22:43     Template #13
metaluga145, Подключение исходного кода в клиентском коде не логично, потому что интерфейс в идеале должен бы быть полон или в документации должно быть указано, что без включения файла реализации линковаться не будет.
Yandex
Объявления
19.04.2013, 22:43     Template
Ответ Создать тему
Опции темы

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