2014-10-07 132 views
-1

我想根据定义加载各种头文件(模块,插件)。继承人我的方法:如何实现动态模块(在头文件中)加载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”?也许操作符重载?或者如果有人不可能做到,有人会建议我采用更好更简单的方法吗? (我真不明白它是如何工作该库:))

编辑:

很抱歉,如果我是不确定的,所以这里是一些代码:

这是一个毫无意义的例子,但我想让这样的事情,但当然更复杂:

Mymodule1.h:

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

和智能说: “在YPE限定符不允许在非成员函数“

又如:

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

和智能说: ‘T’是未定义的,标识符‘_data’未定义

+0

实际上你是如何使用它的(http://stackoverflow.com/posts/26241935/edit)? – 2014-10-07 17:46:09

+0

您可以创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示?还请包括您拥有的任何和所有错误。 – 2014-10-07 17:58:20

+0

例如: container <> img; ... load image ... container <> dest; dest = image.fooOnContainer([阈值或其他]) – ex4cutor 2014-10-07 18:00:56

回答

0

哦,所以你只能从intellisense中得到错误?不是来自实际的编译器?这是因为编辑器编辑Mymodule1.h文件时编辑器不具备所有数据,编辑器不知道代码实际上是大类的一部分。

解决方案?没有,如果你想继续使用这样的头文件。唯一的解决方案是不使用头文件,而是在实际代码周围使用预处理器条件。

+0

好吧,似乎它只是intellisense,我是一个白痴:)(我编译错误之前,但之后,我相信intellisense,并没有编译它...) 我想我会尝试使用预处理器条件来摆脱我的.h文件中的thoose错误或类似的东西,谢谢! – ex4cutor 2014-10-07 20:06:10

0

它类似于包括后卫,应该使用 #ifndef代替 #ifdef

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

这里的事情是编译器用a.h文件的内容替换#include“a.h”。没有metter它包含。如果当前上下文中的语法是正确的,那么它应该都是好的。

我试过你的代码,一切正常。所以请提供有关错误的详细信息。

+0

我认为OP实际上只想包含文件,如果宏*是*定义,而不是其他方式。 – 2014-10-07 17:55:20

+0

是的,我的坏。我已经更新 – teivaz 2014-10-07 18:10:50