我想根据定义加载各种头文件(模块,插件)。继承人我的做法:
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
}
在包含“main”的文件中:
#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;
}
和intellisense说: “非成员函数不允许使用类型限定符”
另一个例子:
T getPos(int x) const {
T* px;
return _data[x];
}
和intellisense说: “T”未定义,标识符“_data”未定义
答案 0 :(得分:0)
类似于包含警卫,应该使用 #ifndef
代替#ifdef
...
#ifndef mymodule1
#include mymodule1
#endif
...
击> <击> 撞击>
这里的事情是编译器将#include“a.h”替换为a.h文件的内容。没有它包含的内容。如果当前上下文中的语法是正确的,那么它应该都是好的。
我已经尝试过您的代码,一切正常。所以请提供有关错误的详细信息。
答案 1 :(得分:0)
哦,所以你只是从intellisense得到错误?不是来自实际的编译器?那是因为编辑器在编辑Mymodule1.h
文件时没有所有数据,编辑器不知道代码实际上是更大类的一部分。
解决方案?没有,如果你想继续使用这样的头文件。唯一的解决方案是不使用头文件,而是使用围绕实际代码的预处理器条件。