2014-10-07 3 views
-1

Я хочу загрузить различные файлы заголовков (модули, плагины) в зависимости от определений. Heres мой подход:Как реализовать динамический модуль (в файлах заголовков) loading C++

template<typename T = float> 
class container { 
    T *_data; 

#ifdef mymodule1 
#include mymodule1 
#endif 

...} 

Mymodule1.h:

container<T> fooOnContainer() [maybe const] { 
    makesomething involving the T template parameter 
} 

И в файле, содержащем "главный":

#define mymodule1 "mymodule1.h" 
#include "container.h" 
in main { using it } 

Поэтому в основном только определенные файлы заголовков будут включены в мой контейнер. Я видел этот подход в библиотеке под названием «cimg», но я не могу заставить его работать, потому что компилятор не может вывести параметр шаблона. Это нормально, если я сделать что-то вроде:

container<T>& fooOnContainer(T param) { 
... 
} 

Но есть способ сделать это, как и в первом «mymodule1.h»? Может быть, с перегрузкой оператора? Или кто-то может предложить мне лучший и простой подход, если это невозможно сделать? (Я действительно не понимаю, как это работает для этой библиотеки :))

Edit:

Извините, если я был неопределенным, поэтому здесь некоторый код:

Это бессмысленно пример, но я хочу сделать что-то подобное, но, конечно, более сложная:

Mymodule1.h:

int getWidth() const { 
    return (*this)._width; 
} 

и IntelliSense говорит: "а Тип отборочные не допускается членом Церкви функции "

Другой пример:

T getPos(int x) const { 
    T* px; 
    return _data[x]; 
} 

и IntelliSense говорит: „T“не определено, идентификатор„_data“неопределен

+0

Как вы ['using it'] (http://stackoverflow.com/posts/26241935/edit) на самом деле? –

+0

Можете ли вы создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам? Кроме того, пожалуйста, укажите любые и все ошибки, которые у вас есть. –

+0

например .: контейнер <> img; ... загрузить изображение ... контейнер <> dest; dest = image.fooOnContainer ([пороговое значение или что-то]) – ex4cutor

ответ

0

О, так что вы получаете ошибки от intellisense? Не из реального компилятора? Это потому, что редактор не имеет всех данных при редактировании файла Mymodule1.h, редактор не знает, что код на самом деле является частью более крупного класса.

Решения? На самом деле, нет, если вы хотите продолжать использовать заголовочные файлы. Единственное решение - не использовать файлы заголовков, а вместо этого использовать условия препроцессора вокруг фактического кода.

+0

Ну, похоже, что это только intellisense, я идиот :) (у меня раньше были компиляции ошибок, но после этого я доверял intellisense и не компилировал его ...) Думаю, я постараюсь используйте препроцессорные условия, чтобы избавиться от ошибок thoose в моих файлах .h или что-то в этом роде, спасибо! – ex4cutor

0

Это похоже на то, включают охрана и следует использовать вместо #ifndef #ifdef

... 
#ifndef mymodule1 
#include mymodule1 
#endif 
... 

Дело в том, что компилятор заменяет #include "a.h" содержимым файла a.h. Ничего не измените, что он содержит. Если синтаксис в текущем контексте правильный, то все должно быть хорошо.

Я пробовал ваш код и все работало нормально. Поэтому, пожалуйста, предоставьте подробную информацию об ошибках.

+0

Я думаю, что OP фактически хочет включить файл, если макрос * определен *, а не наоборот. –

+0

Да, мое плохое. Я обновил – teivaz

 Смежные вопросы

  • Нет связанных вопросов^_^