繁体   English   中英

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

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

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

我希望它有一个RColor结构。

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

我不想总是在RColor定义中写cv::something 所以我尝试在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 ,你写:

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

对此的正确回应是“不要懒惰,写下来”。 显式限定很好,这就是名称空间的用途。 至少在类定义本身中,你无法绕过它(*) - 你想阻止cv的标识符污染全局命名空间。 请注意,它还使代码更加自我记录: cv::transform告诉读者更多关于类型或函数的信息,而不仅仅是transform (后者是cv::transformstd::transform或......?)

如果你真的想要并且需要节省输入RColor cv:: inside成员函数,你可以using namespace cv; 在成员函数定义中。 但我不会这样做。


(*)有实际上一种方式来实现你想要什么,但它是相当哈克(和永远不会通过代码审查和我)。 但出于完整感,这里有:

// common_module.h

namespace NobodyTryToUseThisName
{
  using namespace cv;

  struct RColor
  {
    // ... definition here
  };
}

using NobodyTryToUseThisName::RColor;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM