Понимание шаблонов в C ++
Я пытаюсь запустить следующую программу, но она генерирует ошибку компиляции:
#ifndef TEMPLATE_SUM_H_
#define TEMPLATE_SUM_H_
template<typename T>
class sum
{
public:
sum() {
val_1 = 0;
val_2 = 0;
}
sum(T a, T b) {
val_1 = a;
val_2 = b;
}
friend std::ostream& operator<<(std::ostream &, const sum<> &);
private:
T val_1, val_2;
T result() const;
};
#endif
Исходный файл:
include <iostream>
#include "inc/sum.h"
template<typename T>
T sum<T>::result() const {
return (val_1 + val_2);
}
template<typename T>
std::ostream& operator<<(std::ostream& os, const sum<T>& obj) {
//std::ostream& operator<<(std::ostream& os, sum<T>& obj) {
os << obj.result();
return os;
}
int main()
{
sum<int> int_obj(15, 15);
sum<float> float_obj(5.2, 3.5);
std::cout << "result of int = " << int_obj << std::endl;
std::cout << "result of float = " << float_obj << std::endl;
return 0;
}
Компилирование сg ++ (4.4.3) он генерирует следующую ошибку:
In file included from template.cpp:2:
inc/sum.h:18: error: wrong number of template arguments (0, should be 1)
inc/sum.h:5: error: provided for ‘template<class T> class sum’
template.cpp: In function ‘std::ostream& operator<<(std::ostream&, const sum<T>&) [with T = int]’:
template.cpp:20: instantiated from here
template.cpp:5: error: ‘T sum<T>::result() const [with T = int]’ is private
template.cpp:12: error: within this context
template.cpp: In function ‘std::ostream& operator<<(std::ostream&, const sum<T>&) [with T = float]’:
template.cpp:21: instantiated from here
template.cpp:5: error: ‘T sum<T>::result() const [with T = float]’ is private
template.cpp:12: error: within this context
1) Может ли кто-нибудь помочь мне в выявлении ошибки? Также, пожалуйста, предложите несколько ссылок, где я могу найти краткую абсолютную информацию о том, как использовать шаблоны в C ++.
2) Я прочитал, что шаблонные функции / классы, объявленные в заголовочном файле и определенные отдельно, подвержены ошибкам компоновки. Кто-нибудь может объяснить / уточнить это? Есть ли возможность связать ошибку в приведенном выше примере?
Заявление как ниже:
«Если шаблон или встроенная функция объявлена в файле .h, определите его в этом же файле. Определения этих конструкций должны быть включены в каждый файл .cpp, который их использует, или в программуможет быть не в состоянии связать в некоторых конфигурациях сборки«.
Этот пример можно сделать более простым способом, без использования перегруженного оператора и т. Д. Но я пытаюсь изучить / отработать шаблоны и экспериментировать с некоторыми функциями.