如何定义一个使用命名空间的全局结构,以便使用该结构的文件不使用该命名空间?c++

How to define a global struct which uses namespace so that files which use the struct do not use this namespace? c++

本文关键字:结构 命名空间 何定义 文件 c++ 定义 全局 一个      更新时间:2023-10-16

我有一个common_module.h文件,它应该存储大多数.cpp文件使用的结构和函数。

我希望它有一个RColor结构。

RColor使用了命名空间cv中的许多函数和变量。该项目的制作方式是.cpp文件通常使用cv命名空间(所有使用它的工作大多由RColor等结构完成)

我不想总是把cv::something写在RColor的定义中。所以我尝试在common_module.h中创建一个RColor原型,并将其定义为Rcolor.cpp:

//common_module.h
//...
struct RColor;

#include "stdafx.h"
#include<opencv2/opencv.hpp>
using namespace cv;
struct RColor
{
    ...
};

//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'

您得到错误是因为使用RColor的代码需要查看其定义,而不仅仅是声明。您必须将定义移动到页眉。

关于如何处理名称空间cv,您可以写:

我不想总是把cv::something写在RColor的定义中。

对此的正确回应是"不要懒惰,写出来。"显式限定很好,这就是名称空间的作用。至少在类定义本身中,您没有办法绕过它(*)-您希望防止cv中的标识符污染全局命名空间。请注意,它还使代码更加自文档化:cv::transform告诉读者更多关于类型或函数的信息,而不仅仅是transform(后者是cv::transform还是std::transform或…?)

如果确实希望并需要在RColor的成员函数中键入cv::,则可以将using namespace cv;放入成员函数定义中。但我甚至不会这么做。


(*)实际上是实现你想要的东西的一种方法,但它很难(而且永远不会通过我的代码审查)。但出于完整性的考虑,以下是:

// common_module.h
namespace NobodyTryToUseThisName
{
  using namespace cv;
  struct RColor
  {
    // ... definition here
  };
}
using NobodyTryToUseThisName::RColor;

但正如我所说,我不建议这样做。