尽管包含头文件

时间:2017-09-12 12:13:45

标签: c++ namespaces cinder

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

工作示例

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

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

1 个答案:

答案 0 :(得分:0)

您是否尝试使用::ci::qtime而非简单ci::qtime来引用全局命名空间?这不应该有所作为,但有时候C ++编译器会绊倒这些东西。