Компиляция в Eclipse C++ (Linux)

118
13 октября 2019, 03:40

подскажите как Вы компилируете в Eclipse?

Я начал писать один проект, и столкнулся со следующем (ниже прикладываю код)

Property.h

#ifndef PROPERTY
#define PROPERTY
#include <stdlib.h>
#include<functional>
using namespace std;
namespace Extentions
{
// Property types
class ReadOnly;
class WriteOnly;
class ReadWrite;
// Property structure
template<typename T_param, typename Access>
class Property;
// Property getter
    template<typename T_param>
    class Property<T_param, ReadOnly>
    {
    protected:
        T_param *_param;
    public:
        Property(T_param *param) : _param(param){};
        operator T_param();
    };
    template<typename T_param>
    Property<T_param, ReadOnly>::operator T_param()
    {
        return *_param;
    }
// Property setter
    template<typename T_param>
    class Property<T_param, WriteOnly>
    {
    protected:
        T_param *_param;
        function<bool(T_param)> checkParam;
    public:
        Property(T_param *param, function<bool(T_param)> paramChecker) : _param(param),
        checkParam(paramChecker){};
        void operator =(T_param param);
    };
    template<typename T_param>
    void Property<T_param, WriteOnly>::operator =(T_param param)
    {
        if(checkParam(param))
            *_param = param;
    };
// Property setter and getter
    template<typename T_param>
    class Property<T_param, ReadWrite>
    {
    protected:
        T_param *_param;
        function<bool(T_param)> checkParam;
    public:
        Property(T_param *param, function<bool(T_param)> paramChecker) : _param(param),
        checkParam(paramChecker){};
        Property(T_param *param) : _param(param),
                checkParam([](T_param){ return true;}){};
        void operator =(T_param param);
        operator T_param();
    };
    template<typename T_param>
    void Property<T_param, ReadWrite>::operator =(T_param param)
    {
        if(checkParam(param))
            *_param = param;
    };
    template<typename T_param>
    Property<T_param, ReadWrite>::operator T_param()
    {
        return *_param;
    }
}
#endif

Это мой заголовочный файл. А ниже тестовый проект:

#include <iostream>
#include "../headders/Property.h"
using namespace std;
using namespace Extentions;
class MyTestClass
{
private:
    int i = 5;
public:
    Property<int, ReadOnly> p_R;
    Property<int, WriteOnly>p_W;
    Property<int, ReadWrite> p_RW;
    MyTestClass() : p_R(&i),
                    p_W(&i,[](int data){return data > 10;}),
                    p_RW(&i){}
};
int main() {
    MyTestClass cl;
    cl.p_RW = 18;
    int j = cl.p_RW;
    cout << j << endl;
    return 0;
}

Когда я компилирую все как есть сейчас - все компилируется, однако когда я пробую выносить реализацию методов в Property.cpp (т.е. просто переношу реализацию которая сейчас в заголовочном файле объявлена - в файл с расширением .cpp) - я получаю ошибку. Причем ecleapse прописывает на сколько я понял в make файле все как нужно, ошибка в том что он пытается скомпилировать с явно определенным шаблоном где T_param = int. т.е. если я переношу всю реализацию как есть сейчас из заголовочного файла - в файл "Prorerty.cpp" - сыпятся ошибка, но если я в том же Property.cpp не изменяя кода явно реализую шаблон T_param чисто для int то тогда код компилируется и выполняется верно.

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

Подскажите как бы разрешить данную ситуацию ?

А так же интересует (как дополнение к вопросу) можно ли самому компилировать по собственным make файлам внутри среды (т.е. если я все же захочу скормить Ecleapse свой MakeFile то как мне это сделать ?)

Answer 1

Шаблоны порождают код только тогда, когда вы употребляете этот шаблон в программе с конкретными параметрами. Нельзя скомпилировать модуль содержащий просто шаблон класса. А вот если вам заранее известно, что будет использоваться конкретный тип, можете вынести его в Property.cpp(что вы собственно и сделали для int). Но тогда все что угодно кроме int будет приводить к ошибкам, так что смысла в данном случае так делать не вижу.

Теперь про eclipse(как вы если превратили в ecleapse ума не приложу :D), просто загуглите "creating your makefile eclipse" и получите иллюстрированную статейку на help.eclipce

READ ALSO
Принцип работы функции getche()

Принцип работы функции getche()

Программа должна посчитать количество символов и слов в введённой строке, считывание осуществляется при помощи функции getche()

124
Как найти путь бинарного файла?

Как найти путь бинарного файла?

Исполняемое приложение подключает плагинКак внутри этого плагина узнать абсолютный путь по которому он лежит?

134
Удаление элементов вектора

Удаление элементов вектора

Подскажите, как корректно пройтись по вектору и удалить некоторые его элементыТ

134
Отключение исключений и RTTI в VS2017

Отключение исключений и RTTI в VS2017

Смотрел видео Mike Acton и там рассказывалось, что в геймдеве не используют исключения, RTTI и тд

139