[英]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::transform
或std::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.