试图在不了解某些内容的情况下编译.h文件

Trying to compile a .h file without understanding something

本文关键字:情况下 编译 文件 不了解      更新时间:2023-10-16

我正试图在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更清晰,也可以使用它。