我对'使用命名空间'声明的范围感到困惑...希望有人可以为我清除这一点!
我正在使用两个库(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:\库\ opencv2.1 \包括\的OpenCV \ cxtypes.h(154) :unsigned char uchar'1>或
D:\库\ ogresdk \包括\怪物\ OgrePrerequisites.h(106) :Ogre :: uchar'
我似乎误解了一些事情,因为我认为这应该没问题?
任何帮助都非常感谢!
谢谢,
杰克
答案 0 :(得分:1)
看起来发生的事情是你有一行声明uchar
,例如uchar x = 12
或其他什么。在文件的顶部,您已指定您正在使用Ogre命名空间。编译器遇到了一个问题,确定你正在使用哪个uchar
- cxtypes.h或Ogre :: uchar。
尝试取出using namespace Ogre;
并将您的函数调用作为Ogre::doStuff()
来消除歧义。
答案 1 :(得分:1)
根本问题是cv名称空间中的uchar
在uchar
在Orge命名空间中(因此Ogre::)。添加using namespace Ogre;
,您实际上是对uchar
不明确的任何引用。
正如spbots所指出的,您可以删除命名空间用法来解决您的问题,但我想解决有关命名空间的根问题。答案/问题是其他uchar(cxtypes one)根本不在命名空间中。它只是在任何命名空间之外的头文件中声明。