如何定义一个使用命名空间的全局结构,以便使用该结构的文件不使用该命名空间?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
等结构完成)
我不想总是把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;
但正如我所说,我不建议这样做。
相关文章:
- 哪些C结构出现在std命名空间中
- CERN 根:为命名空间中的外部"C"结构生成流处理器
- 成员的结构与命名空间的潜在范围
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 为在与类方法中的类相同的命名空间中定义的结构调用重载运算符
- 命名空间、标头和对象的层次结构
- 命名空间外部变量的未定义参考/多重定义,C 结构问题
- 为什么我不能将该操作员的过载与结构相同的命名空间
- 我是否可以在类似于 C# 的 C++ 中创建全局命名空间层次结构,以帮助开发人员使用我们的代码?
- 将结构放在匿名命名空间中有什么作用?
- 命名空间中常量结构、类和数组的初始化
- 无法在 Cython 中带有命名空间的C++代码中返回 C 结构
- 为什么结构必须与模板类位于同一命名空间中才能编译
- 使用模板结构作为命名空间
- 匿名命名空间中的静态结构
- 引用命名空间中的结构类型
- 类型定义和结构命名空间在 C 与 C++ 中
- C++ 当命名空间发生冲突时,为什么结构/类不与变量和函数发生冲突?
- 如何定义一个使用命名空间的全局结构,以便使用该结构的文件不使用该命名空间?c++
- Python扩展模块包结构(命名空间)