Многофайловый проект
Вот такое чудо получилось, не стал все функции вставлять, выводит одни и те же ошибки у каждого направления, впервые столкнулся с многофайловыми проектами, искал в поисковике, вроде бы в основном схоже, не понимаю в чем ошибка. Прошу помощи. Снизу скрин ошибок.
main функция
#include "Mnogochlen.h"
#include "Chetyrehchlen.h"
#include "Dvuchlen.h"
#include "Trehchlen.h"
#include <iostream>
using namespace std;
template<typename T>
int main()
{
Mnogochlen<T> Mname(4, 5, 6);
Mname.foo();
}
// Mnogochlen.h
#pragma once
template<typename T>
class Mnogochlen
{
protected:
T a = 1;
T b = 1;
T c = 1;
double S = a * x * x + b * x + c;
public:
Mnogochlen();
Mnogochlen(T a , T b, T c);
~Mnogochlen();
void Set(T a, T b, T c);
T GetA();
T GetB();
T GetC();
void Show();
void foo();
};
// Mnogochlen.cpp
#include "Mnogochlen.h"
#include <iostream>
#include <cmath>
using namespace std;
template<typename T>
Mnogochlen<T>::Mnogochlen(T a, T b, T c)
{
this->a = a;
this->b = b;
this->c = c;
}
template<typename T>
void Mnogochlen<T>::Set(T a, T b, T c)
{
this->a = a;
this->b = b;
this->c = c;
}
template<typename T>
void Mnogochlen<T>::Show()
{
cout << "a * x * x + b * x + c = 0" << endl;
}
// Trehchlen.h
#pragma once
template<typename T>
class Trehchlen : public Mnogochlen<T> {
public:
T S;
void Set3(T a, T b, T c) : Set(a, b, c);
void foo3(); // квадрат трехчлена
};
template<typename T>
double operator+(const Trehchlen<T>& a, const Trehchlen<T>& b) {
return a.S + b.S;
};
template<typename T>
double operator*(const Trehchlen<T>& a, const Trehchlen<T>& b) {
return a.S * b.S;
};
template<typename T>
double operator/(const Trehchlen<T>& a, const Trehchlen<T>& b) {
return a.S / b.S;
};
Trehchlen.cpp
#include "Trehchlen.h"
#include "Mnogochlen.h"
template<typename T>
void Trehchlen<T>::Set3(T a, T b, T c)
{
}
template <typename T>
void Trehchlen<T>::foo3() {
S = a * a + b * b + c * c + 2 * a * b + 2 * b * c + 2 * a * c;
}
Ответы (1 шт):
Автор решения: Ildar
→ Ссылка
шаблоны в файле cpp не будут работать как вы ожидаете, так как компилятор компилирует файлы отдельно он не может следить за определениями и обьявлениями, используемыми для инстанцирования шаблона, поэтому на этапе линковки будут ошибки, для решения проблемы можно:
- cpp включать c помощью #include в файл h, но это не рекомендуется
- помещать и обьявление и определение в h файл
- делать явную специализацию шаблона
template class Mnogochlen<int>; - вместо cpp написать inl и подключить этот файл в конце h файла
