[英]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“沒有命名類型”。 為什么? 所有標題都有多個包含定義(為清楚起見,此處未顯示)。
謝謝
問題:
由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
指令 bar
可能在foo.h中向前聲明,你的例子雖然沒有透露這種情況的必要性)。 如果使用這些建議無法解決問題,請使用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.