【问题标题】:Confused about namespace scope!对命名空间范围感到困惑!
【发布时间】:2011-07-17 12:08:02
【问题描述】:

我对“使用命名空间”声明的范围感到困惑......希望有人能帮我解决这个问题!

我正在使用两个库(OpenCV 和 Ogre3D)。我有两个 cpp 文件,一个专门使用 OpenCV (PoseEstimator.cpp),另一个专门使用 Ogre3D (OgreLogic.cpp)。

OgreLogic.cpp 的顶部是这样的:

#include "stdafx.h"

#include "PoseEstimator.h"
#include "OgreLogic.h"

using namespace Ogre;

而 PoseEstimator.cpp 的顶部看起来像这样:

#include "StdAfx.h"
#include "PoseEstimator.h"

using namespace cv;
using namespace std;

这个'using namespace cv'是整个项目中唯一出现的(我通过搜索进行了双重检查)。标头中没有“使用命名空间”,仅在 cpp 文件中。

但是,在编译 OgreLogic.cpp 时出现歧义错误,例如:

cxmat.hpp(3465) : 错误 C2872: 'uchar' : 模棱两可的符号 1> 可能是 'd:\libraries\opencv2.1\include\opencv\cxtypes.h(154) : unsigned char uchar' 1> 或
'd:\libraries\ogresdk\include\ogre\OgrePrerequisites.h(106) : 食人魔::uchar'

我似乎误会了什么,因为我认为这应该没问题?

非常感谢任何帮助!

谢谢,

杰克

【问题讨论】:

    标签: c++ namespaces scope


    【解决方案1】:

    看起来正在发生的事情是您有一行声明uchar,例如uchar x = 12 什么的。在你的文件的顶部,你已经指定你正在使用 Ogre 命名空间。编译器在确定您正在使用哪个 uchar 时遇到问题 - 是 cxtypes.h 还是 Ogre::uchar。

    尝试去掉 using namespace Ogre; 并将函数调用作为 Ogre::doStuff() 来消除歧义。

    【讨论】:

    • 感谢您的帮助。我通过将 cxmat.hpp(一个 openCV 头文件)中的 uchar 引用更改为 unsigned char 来“解决”这个问题。似乎现在可以工作了!
    • 一不小心发的太早了,想回车换行被抓到了!
    【解决方案2】:

    根本问题是 cxtypes.h 中的 uchar 在 cv 命名空间中不是。 OrgePrerequisites.h 中的uchar 在 Orge 命名空间中(因此是 Ogre::)。通过添加using namespace Ogre;,您实际上是在对uchar 进行任何引用。

    正如 spbots 所指出的,您可以删除命名空间使用来解决您的问题,但我想解决您关于命名空间的根本问题。答案/问题是另一个 uchar(cxtypes 之一)根本不在命名空间中。它只是在任何命名空间之外的头文件中声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 2010-09-29
      • 2014-07-08
      • 2017-09-20
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多