簡體   English   中英

C ++編譯錯誤枚舉“沒有命名類型”

[英]C++ compilation error enum “does not name a type”

以下代碼:

foo.h中

#include "bar.h"
class foo{ 
public:
   enum my_enum_type { ONE, TWO, THREE }; 
   foo(); 
   ~foo() {} 
};

Foo.cpp中

foo::foo()
{
   int i = bar::MY_DEFINE;
}

bar.h

#include "foo.h"
class bar{
public:
   static const int MY_DEFINE = 10;
   foo::my_enum_type var;
   bar() {};
   ~bar() {};
};

使g ++編譯器抱怨my_enum_type“沒有命名類型”。 為什么? 所有標題都有多個包含定義(為清楚起見,此處未顯示)。

謝謝

問題:

  • 沒有多重包含保護
  • 循環包含
  • 在循環包含引起的聲明之前鍵入use

由C預處理器處理的foo.h看起來像無限空字符串序列。

通過多個包含保護,foo.h被預處理為:

> cpp foo.h
class bar{ // preprocessed from #include "bar.h"
public:
   static const int MY_DEFINE = 10;
   foo::my_enum_type var;
   bar() {};
   ~bar() {};
};
// end of #include "bar.h"
class foo{ 
public:
   enum my_enum_type { ONE, TWO, THREE }; 
   foo(); 
   ~foo() {} 
};

這顯然不是一個有效的C ++代碼 - 沒有事先聲明,foo用在bar體中。 與Java不同,C ++需要在使用之前聲明類型。

  • 使用多重包含保護。 根據您的平台,可能是#ifndef宏或#pragma once指令
  • 從foo.h中刪除bar.h包含。
  • 在需要的地方放置前向聲明(在你的情況下bar可能在foo.h中向前聲明,你的例子雖然沒有透露這種情況的必要性)。
  • 盡可能多地將實現移動到* .cpp文件。

如果使用這些建議無法解決問題,請使用PIMPL慣用法

簡而言之 - 只需從foo.h中刪除#include "bar.h"指令

foo()
{
   int i = bar::MY_DEFINE;
}

應該

foo::foo()
{
   //...
}

另請注意

static const int MY_DEFINE = 10;

仍然是一個聲明,雖然它有一個初始化器。 在bar.cpp中,您應該有以下行

const int bar::MY_DEFINE;

另外你不能包括來自f.h的bar.h和來自bar.h的foo.h ...這實際上是不可能的:)

您必須刪除循環依賴項,因此您需要將foo.cpp和foo.h視為不同的單位。

  • bar類定義必須看到foo :: my_enum_type所以可能bar.h包括foo.h是必需的。

  • foo類定義不使用任何bar,所以foo.h不需要包含bar.h

  • foo.cpp確實需要查看MY_DEFINE的欄,所以foo.cpp應該包含bar.h. 這實際上也會自動引入foo.h但你可能希望在foo.cpp中包含它,以防你以后刪除依賴。

據推測,你的標題有多個包含警戒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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