Всех приветствую. Пытаюсь понять как использовать template в С++.
Как я понял, удобство template состоит в том, что можно использовать его как-то так:
Вместо создания 3-х методов чтения float, int, byte из файла :
void ReadFloat(){
}
void ReadInt(){
}
void ReadByte(){
}
Можно использовать что-то типа такого:
template<typename T>
T Read(){
T s;
file.Read(s, sizeof(T));
return s;
}
Но в примерах я встречаю лишь вот такое:
template <class T>
class MyTemplate
{
public:
void dump();
T t;
};
template <class T>
void MyTemplate<T>::dump()
{
cerr << t << endl;
}
И использование:
MyTemplate<float> m_t;
m_t.dump();
Но тут мне непонятно 2 вещи:
Получается, что для каждого типа данных мне нужно создавать новые объекты?
А если, к примеру, из всего класса мне нужно использовать template лишь к 1 методу, а не ко всему классу?
Я попробовал так:
class FILE_READER{
public:
bool just_something();
template <class T>
T Read();
template <class T>
void Write(T value);
};
template<class T>
T FILE_READER::Read() {
T value;
// куда записывать
ReadFile(T, sizeof(T));
return value;
}
template<class T>
void FILE_READER::Write(T value)
{
WriteFile(T, sizeof(T));
}
// БЕЗ template
bool FILE_READER::just_something(){
// do something...
}
Как можно это реализовать правильно?
UPD: Как я прочитал в ответах, у всех прекрасно компилируется.
У меня же выдает такую ошибку:
LNK2019 unresolved external symbol "public: void __thiscall FILE_READER::Write(void)" (??$Write@H@F@@QAEXXZ) referenced in function _main TM D:\C++ Projects\TM\TM\TM.obj 1
UPD_2:
Я попробовал вставить весь этот код в 1 файл (header):
class FILE_READER{
public:
bool just_something();
template <class T>
T Read();
template <class T>
void Write(T value);
};
template<class T>
T FILE_READER::Read() {
T value;
// куда записывать
ReadFile(T, sizeof(T));
return value;
}
template<class T>
void FILE_READER::Write(T value)
{
WriteFile(T, sizeof(T));
}
// БЕЗ template
bool FILE_READER::just_something(){
// do something...
}
Тут же начинаю разбрасывать по cpp и h файлам - выдается верхняя ошибка.
test.cpp:
#include "pch.h"
#include "Test.h"
template<class T>
T FILE_READER::Read() {
T value;
// куда записывать
cout << sizeof(T) << endl;
return value;
}
template<class T>
void FILE_READER::Write(T value)
{
cout << sizeof(T) << endl;
}
// БЕЗ template
bool FILE_READER::just_something() {
// do something...
return true;
}
test.h:
#pragma once
#include <iostream>
using namespace std;
class FILE_READER {
public:
bool just_something();
template <class T>
T Read();
template <class T>
void Write(T value);
};
Можно использовать что-то типа такого:
template<typename T>
T Read(){
T s;
file.Read(s, sizeof(T));
return s;
}
Так используйте, почему нет.
Но в примерах я встречаю лишь вот такое: [шаблон класса]
Значит, мало примеров посмотрели. Бывают шаблоны функций (как у вас), бывают шаблоны классов (как в ваших примерах). Даже шаблоны переменных бывают.
MyTemplate<float> m_t;
m_t.dump();
Получается, что для каждого типа данных мне нужно создавать новые объекты?
Да. Но их иожно делать временными!
MyTemplate<float>{}.dump();
А если, к примеру, из всего класса мне нужно использовать template лишь к 1 методу, а не ко всему классу?
Я попробовал так: [код]
Все правильно пробовали. У меня этот код компилируется.
UPD_2:
Я попробовал вставить весь этот код в 1 файл (header) - все заработало.
Тут же начинаю разбрасывать по cpp и h файлам - выдается
LNK2019 unresolved external symbol "public: void __thiscall FILE_READER::Write(void)" (??$Write@H@F@@QAEXXZ) referenced in function _main TM D:\C++ Projects\TM\TM\TM.obj 1
Ну это классика. Определения шаблонов должны быть в хедерах (кроме особых случаев).
Раз: Разделение класса в заголовочный файл и в файл с кодом
Два: Не работает обьявление шаблона класса в заголовочном файле с определением методов в отдельном файле реализации
И так далее.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей