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

时间:2014-09-03 07:27:05

标签: c++ struct namespaces

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

我希望它有一个RColor结构。

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

我不想总是在cv::something的定义中写RColor。所以我尝试在RColor中创建一个common_module.h原型并将其定义为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'

1 个答案:

答案 0 :(得分:3)

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

关于如何处理命名空间cv,你写:

  

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

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

如果确实想要并且需要在cv::的成员函数内输入RColor时保存,则可以将using namespace cv;放在成员函数定义中。但我不会这样做。


(*) 实际上是实现你想要的东西的方法,但是它非常hacky(并且永远不会通过我的代码审查)。但出于完整感,这里有:

// common_module.h

namespace NobodyTryToUseThisName
{
  using namespace cv;

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

using NobodyTryToUseThisName::RColor;

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