gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:44:02 27 4
gpt4 key购买 nike

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

我希望它有一个 RColor 结构。

RColor 使用了命名空间 cv 中的大量函数和变量。该项目的创建方式是 .cpp 文件通常使用 cv 命名空间(所有与它相关的工作主要由 RColor 等结构完成)

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

I don't want to always write cv::something in definition of RColor.

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

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


(*) 实际上是一种实现您想要的东西的方法,但是它很老套(并且永远不会通过我的代码审查)。但是出于完整性的考虑,这里是:

// common_module.h

namespace NobodyTryToUseThisName
{
using namespace cv;

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

using NobodyTryToUseThisName::RColor;

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

关于c++ - 如何定义一个使用命名空间的全局结构,以便使用该结构的文件不使用此命名空间? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25638605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com