C++ 如何定义使用命名空间的全局结构,以便使用该结构的文件不使用此命名空间?c++;
我有一个C++ 如何定义使用命名空间的全局结构,以便使用该结构的文件不使用此命名空间?c++;,c++,struct,namespaces,C++,Struct,Namespaces,我有一个common_module.h文件,它应该存储大多数.cpp文件使用的结构和函数 我希望它有一个RColorstruct RColor使用了许多来自命名空间cv的函数和变量。该项目是以.cpp文件通常不使用cv名称空间的方式创建的(使用它的所有工作主要是通过像RColor这样的结构完成的) 我不想总是在RColor的定义中编写cv::something。因此,我尝试在common_module.h中创建一个RColor原型,并将其定义放到RColor.cpp: //common_modu
common_module.h
文件,它应该存储大多数.cpp文件使用的结构和函数
我希望它有一个RColor
struct
RColor使用了许多来自命名空间cv的函数和变量。该项目是以.cpp文件通常不使用cv名称空间的方式创建的(使用它的所有工作主要是通过像RColor
这样的结构完成的)
我不想总是在RColor
的定义中编写cv::something
。因此,我尝试在common_module.h
中创建一个RColor
原型,并将其定义放到RColor.cpp
:
//common_module.h
//...
struct RColor;
出现错误是因为使用
RColor
的代码需要查看其定义,而不仅仅是其声明。您必须将定义移动到标题
关于如何处理名称空间cv
,您写道:
我不想总是在RColor
的定义中编写cv::something
对此的正确回答是“不要偷懒,写吧。”显式限定很好,这就是名称空间的用途。至少在类定义本身中,您没有办法解决它(*)-您希望防止标识符cv
污染全局命名空间。请注意,它还使代码更加自我记录:cv::transform
比transform
告诉读者更多关于类型或函数的信息(后者是cv::transform
还是std::transform
还是…?)
如果您确实希望并且需要在RColor
的成员函数中键入cv::
进行保存,则可以使用命名空间cv放置成员函数定义中的代码>。但我甚至不会那样做
(*)实际上有一种方法可以实现您想要的,但它非常粗糙(我永远不会通过代码审查)。但出于完整性的考虑,以下是:
// common_module.h
namespace NobodyTryToUseThisName
{
using namespace cv;
struct RColor
{
// ... definition here
};
}
using NobodyTryToUseThisName::RColor;
但正如我所说,我不建议这样做。如果我把它放在一个标题中,我如何使用这个标题而不添加使用名称空间cv
到所有使用它的文件?struct RColor{using namespace cv;}代码>生成错误C2059:语法错误:“名称空间”
错误C2238:前面有意外标记“;”代码>至于你的错误,你需要结构的完整定义来创建它的实例。我不能,可以吗?您是否使用了太多来自cv
名称空间的东西,以至于每次多写四个字符都很麻烦?此外,它将使代码更清晰易读。
//Project0.cpp (main file)
#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<windows.h>
RColor col;
1>error C2079: 'col' uses undefined struct 'RColor'
// common_module.h
namespace NobodyTryToUseThisName
{
using namespace cv;
struct RColor
{
// ... definition here
};
}
using NobodyTryToUseThisName::RColor;