Как корректно вынести конструктор Triangle

Код реализован в h файле. После компиляции кода в main.cpp падают ошибки LNK2005 в main.cpp, LNK2005 в main.cpp, LNK1169 в main.cpp

#ifndef _FIGURE_
#define _FIGURE_
#define _USE_MATH_DEFINES
#include <vector>
#include <iostream>
#include <string>
#include <math.h>
using namespace std;

class Point 
{
private:
    int x;
    int y;
    
public:
    Point(int x, int y) 
    { 
        this->x = x; 
        this->y = y; 
    }
    int get_x() { return x; }
    int get_y() { return y; }
    Point operator * (const Point& f);
    Point operator + (const Point& f);
    Point operator - (const Point& f);
    double sqrt_point ();
};

// Родительский класс
class Figure 
{
protected:
    // Массив типа vector для значения сторон фигуры
    vector<double> meaning;
public:
    virtual double calc_area() = 0;
    virtual double calc_perimetr() = 0;
    virtual string name() = 0;
};

// Дочерний класс фигур Triangle для численных типов
template <typename T>
class Triangle : public Figure
{
public:
    Triangle(T a, T b, T c)
    {
        if (a < b + c && b < a + c && c < b + a)
        {
            meaning.insert(meaning.end(), { a,b,c });
        }
        else throw ExceptionFigure("Error");
    }
    double calc_area();
    string name() 
    { 
        return "Треугольник"; 
    }
    double calc_perimetr() 
    { 
        return meaning[0] + meaning[1] + meaning[2]; 
    }
};

// Реализация методов для Triangle<t>
template<typename T>
double Triangle<T> :: calc_area()
{
    double p = (meaning[0] + meaning[1] + meaning[2]) / 2;
    return sqrt(p*(p-meaning[0])*(p - meaning[1])*(p - meaning[2]));
}

// Дочерний класс Triangle для типа Point
template <>
class Triangle<Point> : public Figure
{
public:
    Triangle(Point a, Point b, Point c);
    double calc_area()
    {
        Triangle<double> temp(meaning[0], meaning[1], meaning[2]);
        return temp.calc_area();
    }
    string name() 
    { 
        return "Треугольник"; 
    }

    double calc_perimetr() 
    { 
        return meaning[0] + meaning[1] + meaning[2]; 
    }
};


Triangle<Point> :: Triangle(Point a, Point b, Point c)
{
    double a_b = (a - b).sqrt_point();
    double b_c = (b - c).sqrt_point();
    double c_a = (c - a).sqrt_point();
    if (a_b < b_c + c_a && b_c < a_b + c_a && c_a < a_b + b_c)
    {
        meaning.insert(meaning.end(), { a_b,b_c,c_a });
    }
    else throw ExceptionFigure("Error");
}

Ответы (0 шт):