[英]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.