对命名空间范围感到困惑!

时间:2011-03-17 15:24:37

标签: c++ namespaces scope

我对'使用命名空间'声明的范围感到困惑...希望有人可以为我清除这一点!

我正在使用两个库(OpenCV和Ogre3D)。我有两个cpp文件,一个专门使用OpenCV(Pos​​eEstimator.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:\库\ opencv2.1 \包括\的OpenCV \ cxtypes.h(154)   :unsigned char uchar'1>或
  D:\库\ ogresdk \包括\怪物\ OgrePrerequisites.h(106)   :Ogre :: uchar'

我似乎误解了一些事情,因为我认为这应该没问题?

任何帮助都非常感谢!

谢谢,

杰克

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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