Многофайловый проект

Вот такое чудо получилось, не стал все функции вставлять, выводит одни и те же ошибки у каждого направления, впервые столкнулся с многофайловыми проектами, искал в поисковике, вроде бы в основном схоже, не понимаю в чем ошибка. Прошу помощи. Снизу скрин ошибок.

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 файла
→ Ссылка