подскажите как Вы компилируете в 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 то как мне это сделать ?)
Шаблоны порождают код только тогда, когда вы употребляете этот шаблон в программе с конкретными параметрами. Нельзя скомпилировать модуль содержащий просто шаблон класса. А вот если вам заранее известно, что будет использоваться конкретный тип, можете вынести его в Property.cpp(что вы собственно и сделали для int). Но тогда все что угодно кроме int будет приводить к ошибкам, так что смысла в данном случае так делать не вижу.
Теперь про eclipse(как вы если превратили в ecleapse ума не приложу :D), просто загуглите "creating your makefile eclipse" и получите иллюстрированную статейку на help.eclipce
Виртуальный выделенный сервер (VDS) становится отличным выбором
Программа должна посчитать количество символов и слов в введённой строке, считывание осуществляется при помощи функции getche()
Исполняемое приложение подключает плагинКак внутри этого плагина узнать абсолютный путь по которому он лежит?
Подскажите, как корректно пройтись по вектору и удалить некоторые его элементыТ
Смотрел видео Mike Acton и там рассказывалось, что в геймдеве не используют исключения, RTTI и тд