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

发布于 2024-11-30 08:47:56 字数 4574 浏览 0 评论 0原文

我正在尝试在 Windows 上使用 Visual Studio 编译 Opengazer(开源凝视跟踪器)代码,而该代码最初是为 Linux 编写的,应该使用 cmake 进行编译。

无论如何,我无法编译几个文件。

代码无法编译是这样的:

Containers.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是空的

广告代码使用上面的类是:

#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 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2146: syntax error : missing ';' before identifier 'iter'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2146: syntax error : missing ')' before identifier 'iter'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2059: syntax error : ';'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2059: syntax error : ')'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2143: syntax error : missing ';' before 'if'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2227: left of '->parent' must point to class/struct/union/generic type
        type is ''unknown-type''
visual studio 2008\projects\eyemouse\eyemouse\containers.h(59) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(59) : error C2227: left of '->process' must point to class/struct/union/generic type
        type is ''unknown-type''

我明白为什么我收到错误。 'iter' 没有在任何地方定义。无论如何,这不是我的代码,它应该可以工作。 我尝试将定义部分复制并粘贴到函数中,但仍然出现相同的错误。 我被这个问题困扰并试图解决它几个小时,但不明白该怎么做才能让它发挥作用。

我真的很感激任何帮助。

I'm trying to compile Opengazer (Open source gaze tracker) code with visual studio on windows, while the code was originally written for linux and should be compile with cmake.

Anyway, I can't compile few files.

The code won't compile is this:

Containers.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 is empty

ad the code uses the above class is:

#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);
};

the error I get is :

visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2146: syntax error : missing ';' before identifier 'iter'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2146: syntax error : missing ')' before identifier 'iter'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2059: syntax error : ';'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2059: syntax error : ')'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2143: syntax error : missing ';' before 'if'
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(58) : error C2227: left of '->parent' must point to class/struct/union/generic type
        type is ''unknown-type''
visual studio 2008\projects\eyemouse\eyemouse\containers.h(59) : error C2065: 'iter' : undeclared identifier
visual studio 2008\projects\eyemouse\eyemouse\containers.h(59) : error C2227: left of '->process' must point to class/struct/union/generic type
        type is ''unknown-type''

I understand why I'm getting an error.
'iter' is not defined anywhere. anyway, this isnt my code and it should work.
I tried to copy and past the define part to the function, but still get the same error.
I'm stuck with this and trying to solve it for hours, but can't understand what to do to make it work.

I'll really be grateful for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

两相知 2024-12-07 08:47:56

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。

typeof is a gcc extension and equivalent to C++0x decltype there is no VS version that actually supports it.

You would need to use C++0x and decltype or try to use Boost.TypeOf, which comes with its own caveats.

Change the macro to this:

#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)

You could also use BOOST_AUTO if you think this is clearer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文