【问题标题】:How to define a global struct which uses namespace so that files which use the struct do not use this namespace? c++如何定义一个使用命名空间的全局结构,以便使用该结构的文件不使用这个命名空间? C++
【发布时间】:2014-10-27 14:48:13
【问题描述】:

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

我希望它有一个 RColor 结构。

RColor 使用了很多来自命名空间 cv 的函数和变量。该项目的制作方式是 .cpp 文件通常使用 cv 命名空间(所有使用它的工作主要由 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'

【问题讨论】:

  • 如果我把它放在一个头文件中,我怎样才能使用这个头文件而不在所有使用它的文件中添加using namespace cv;
  • struct RColor { using namespace cv; }; 产生error C2059: syntax error : 'namespace' error C2238: unexpected token(s) preceding ';'
  • 至于你的错误,你需要一个结构的完整定义来创建它的一个实例。
  • 我不能,可以吗? stackoverflow.com/questions/6326805/…
  • 您是否使用了太多来自cv 命名空间的东西,以至于每次多写四个字符都很麻烦?此外,它将使代码更加清晰易读。

标签: c++ struct namespaces


【解决方案1】:

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

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

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

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

如果您真的想要并且需要节省在RColor 的成员函数中键入cv::,您可以将using namespace cv; 放在成员函数定义中。但我什至不会那样做。


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

// common_module.h

namespace NobodyTryToUseThisName
{
  using namespace cv;

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

using NobodyTryToUseThisName::RColor;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2013-12-13
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多