簡體   English   中英

如何定義使用命名空間的全局結構,以便使用該結構的文件不使用此命名空間? 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結構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::transformstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM