试图在不了解某些内容的情况下编译.h文件
Trying to compile a .h file without understanding something
我正试图在windows上使用visualstudio编译Opengazer(开源凝视跟踪器(代码,而该代码最初是为linux编写的,应该使用cmake编译。
无论如何,我不能编译几个文件。
代码不会编译如下:
容器.h:
#pragma once
#define xforeachactive(iter,container)
for(typeof(container.begin()) iter = container.begin();
iter != container.end(); iter++)
if ((*iter)->parent == this)
template <class ParentType, class ChildType> class Container;
template <class ParentType, class ChildType>
class Containee {
protected:
void detach() { parent = 0; }
public:
ParentType *parent; /* set to null to request removal */
Containee(): parent(0) {}
virtual ~Containee() {}
};
template <class ParentType, class ChildType>
class Container {
typedef ChildType *ChildPtr;
static bool isFinished(const ChildPtr &object) {
return !(object && object->parent);
}
protected:
std::vector<ChildPtr> objects;
void removeFinished() {
objects.erase(remove_if(objects.begin(), objects.end(), isFinished),
objects.end());
}
public:
void clear() {
xforeachactive(iter, objects)
(*iter)->parent = 0;
removeFinished();
}
static void addchild(ParentType *parent, const ChildPtr &child) {
parent->objects.push_back(child);
child->parent = parent;
parent->removeFinished();
}
virtual ~Container() {
clear();
}
};
template <class ParentPtr, class ChildPtr>
class ProcessContainer: public Container<ParentPtr, ChildPtr> {
public:
virtual void process() {
xforeachactive(iter, this->objects)
(*iter)->process();
this->removeFinished();
}
virtual ~ProcessContainer() {};
};
btw Containers.cpp为空
ad代码使用上面的类是:
#pragma once
class FrameProcessing;
class FrameFunction:
public Containee<FrameProcessing, FrameFunction>
{
const int &frameno;
int startframe;
protected:
int getFrame() { return frameno - startframe; }
public:
FrameFunction(const int &frameno): frameno(frameno), startframe(frameno) {}
virtual void process()=0;
virtual ~FrameFunction();
};
class FrameProcessing:
public ProcessContainer<FrameProcessing,FrameFunction> {};
class MovingTarget: public FrameFunction {
WindowPointer *pointer;
public:
MovingTarget(const int &frameno,
const vector<Point>& points,
WindowPointer *&pointer,
int dwelltime=20);
virtual ~MovingTarget();
virtual void process();
protected:
vector<Point> points;
const int dwelltime;
int getPointNo();
int getPointFrame();
bool active();
};
class CalibrationHandler
{
public:
CalibrationHandler(void);
~CalibrationHandler(void);
};
我得到的错误是:
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2146: syntax error : missing ';' before identifier 'iter'
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2146: syntax error : missing ')' before identifier 'iter'
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2059: syntax error : ';'
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2059: syntax error : ')'
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2143: syntax error : missing ';' before 'if'
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008projectseyemouseeyemousecontainers.h(58) : error C2227: left of '->parent' must point to class/struct/union/generic type
type is ''unknown-type''
visual studio 2008projectseyemouseeyemousecontainers.h(59) : error C2065: 'iter' : undeclared identifier
visual studio 2008projectseyemouseeyemousecontainers.h(59) : error C2227: left of '->process' must point to class/struct/union/generic type
type is ''unknown-type''
我明白我为什么会出错。"iter"未在任何位置定义。无论如何,这不是我的代码,它应该可以工作。我试图将define部分复制到函数中,但仍然出现了同样的错误。我被这个问题困扰了好几个小时,试图解决它,但不知道该怎么做才能让它发挥作用。
如果有任何帮助,我将不胜感激。
typeof
是一个gcc扩展,相当于C++0x decltype
,没有VS版本真正支持它。
您可能需要使用C++0x和decltype
,或者尝试使用Boost.TypeOf
,它有自己的注意事项。
将宏更改为:
#include <boost/typeof/typeof.hpp>
#define xforeachactive(iter,container)
for(BOOST_TYPEOF(container.begin()) iter = container.begin();
iter != container.end(); iter++)
if ((*iter)->parent == this)
如果您认为BOOST_AUTO更清晰,也可以使用它。
相关文章:
- 在我的 CLR 项目中添加包含会导致无法在启用 /clr 的情况下编译 WLR
- 如何在没有Cygwin或Visual Studio的情况下编译Magick++?
- 如何在不制作Visual Studio 2017项目的情况下编译C++文件?
- 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此大括号初始化列表代码
- 在没有 -g 选项的情况下编译,但我想获得更详细的调试信息
- 在没有 AVX 的情况下编译提升
- 如何在Ubuntu中不加编译器硬化的情况下编译宝石
- 即使我传递了无效的类型参数,我为什么还能在没有错误的情况下编译此代码
- 当我尝试在启用推理引擎的情况下编译 OpenCv 时,出现错误
- 为什么 C 可以在没有库的情况下编译 time()?
- GLSL 无法在没有插值的情况下编译着色器(平面)
- 在不安装 Visual Studio 的情况下编译 Visual Studio 项目
- 在没有-DNDEBUG和-O3的情况下编译时,标准库实现不使用断言有什么原因吗
- 在不使用CRT的情况下编译C++
- 在没有ros的情况下编译roscpp(使用g++)
- 为什么"A<0>=0"中的模板 id 由于大于或等于运算符">="而无法在没有空格的情况下编译?
- 为什么 rand() 在不包含 cstdlib 或使用命名空间 std 的情况下编译
- 在没有Main的情况下编译C程序
- OpenCV:不支持GPU(该库是在不支持CUDA的情况下编译的)
- 为什么VS2008在没有警告的情况下编译时使用了错误的模板逻辑