我有一个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'
答案 0 :(得分:3)
您收到错误是因为使用RColor
的代码需要查看其定义,而不仅仅是其声明。您必须将定义移动到标题。
关于如何处理命名空间cv
,你写:
我不想总是在
cv::something
的定义中写RColor
。
对此的正确回应是“不要懒惰,写下来”。显式限定很好,这就是名称空间的用途。至少在类定义本身中,你无法绕过它(*) - 你想阻止来自cv
的标识符污染全局命名空间。请注意,它还使代码更加自我记录:cv::transform
告诉读者更多关于类型或功能的信息,而不仅仅是transform
(后者是cv::transform
或std::transform
或者......?)
如果确实想要并且需要在cv::
的成员函数内输入RColor
时保存,则可以将using namespace cv;
放在成员函数定义中。但我不会这样做。
(*) 实际上是实现你想要的东西的方法,但是它非常hacky(并且永远不会通过我的代码审查)。但出于完整感,这里有:
// common_module.h
namespace NobodyTryToUseThisName
{
using namespace cv;
struct RColor
{
// ... definition here
};
}
using NobodyTryToUseThisName::RColor;
但正如我所说,我不建议这样做。