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;