0

我有两个项目,一个是示例(编译时没有错误),看起来像这样(仅显示前几行):

工作示例

#include "cinder/app/App.h"
#include "cinder/app/RendererGl.h"
#include "cinder/Surface.h"
#include "cinder/gl/gl.h"
#include "cinder/gl/Texture.h"
#include "cinder/Rand.h"
#include "cinder/qtime/QuickTimeGl.h"

using namespace ci;
using namespace ci::app;
using namespace std;

class QTimeAdvApp : public App {
  public:
    void prepareSettings( Settings *settings );
    void setup();

    void keyDown( KeyEvent event );
    void fileDrop( FileDropEvent event );

    void update();
    void draw();

    void addActiveMovie( qtime::MovieGlRef movie );
    void loadMovieUrl( const std::string &urlString );
    void loadMovieFile( const fs::path &path );

};

特别注意这一行:void addActiveMovie( qtime::MovieGlRef movie );

另一个项目需要使用相同的库(LibCinder 中的 Quicktime OpenGL),尝试做类似的事情 - 再次提取:

在项目中使用

#pragma once

#include "AbstractContent.h"
#include "cinder/gl/Texture.h"
#include "cinder/Tween.h"
#include "AbstractTransition.h"
#include "cinder/qtime/QuickTimeGl.h"

namespace TH {

    class VideoContent : public AbstractContent {
    public:
        VideoContent();
        ~VideoContent();
        virtual void setup();
        void loadMovie(ci::Url url);
        void loadLocalMovie(ci::fs::path path);
        void setPreloadedMovie(ci::qtime::MovieGlRef movie);

这会引发编译器错误:命名空间“cinder”中没有名为“qtime”的成员

再次注意几乎相同的行:void setPreloadedMovie(ci::qtime::MovieGlRef movie);事实上,您可以ci:qtime:MovieGlRef在第一个示例中使用完整的限定名,它编译得很好(如预期的那样)。

这到底是怎么回事?为什么“在项目中使用”版本会引发编译器错误:命名空间 'cinder' 中没有名为 'qtime' 的成员

为清楚起见,QuickTimeGl.h 文件又包含另一个文件,该文件明确声明了命名空间和类型 def:

namespace cinder { namespace qtime {

typedef std::shared_ptr<class MovieGl>  MovieGlRef;

我错过了什么吗?我很确定我像以前一样包含了正确的头文件,甚至尝试使用完全限定的命名空间,但编译器仍然找不到定义?

4

1 回答 1

0

您是否尝试过使用::ci::qtime而不是简单地引用全局命名空间ci::qtime?这应该没什么区别,但有时 C++ 编译器会遇到这类事情。

于 2017-09-15T12:33:59.733 回答