2010-09-26 68 views
8

我知道我可以做我可以在C++中「前進聲明」?

class Foo; 

,可能

struct Bar; 

和全局函數

bool IsValid(int iVal); 

什麼類型化枚舉?在未聲明的類中的枚舉枚舉怎麼樣?一個帶有未聲明類的函數呢?在未申報的班級中靜態成員怎麼樣?在一個未知的命名空間中,這些怎麼辦?我是否錯過了可以宣佈的其他內容?

+6

你爲什麼不試試看? – 2010-09-26 21:15:10

+0

enum將能夠在C++ 0x中轉發聲明。並且你不能「部分地」轉發聲明類(方法的前向聲明) – erjot 2010-09-26 21:19:03

+0

我傾向於將類型化的枚舉放在「定義」它們的類中。然後我碰到兩個引用對方枚舉的類的「循環依賴」編譯器問題。 – franji1 2010-09-27 00:04:21

回答

12

您可以轉發聲明

  • 模板,其中包括部分特例
  • 明確的專業化
  • 嵌套類(包括結構,「真正的」類和工會)
  • 非嵌套和局部類
  • 變量(「extern int a;」)
  • 功能

如果通過「前向聲明」,你嚴格意思是「聲明但不定義」,你也可以轉發聲明成員函數。但是,一旦聲明瞭他們,你就不能在他們的班級定義中重新聲明他們。你不能轉發 - 聲明枚舉。我不確定我是否錯過了一些東西。

請注意,上面列出的所有前向聲明,除了部分和顯式的特殊化之外,都需要使用非限定名稱聲明,並且成員函數和嵌套類只能在其類定義中聲明但未定義。

class A { }; 
class A::B; // not legal 

namespace A { } 
void A::f(); // not legal 

namespace A { void f(); } // legal 

class B { class C; }; // legal 
class B::C; // declaration-only not legal 

class D { template<typename T> class E; }; 
template<typename T> class D::E<T*>; // legal (c.f. 14.5.4/6) 
+1

我想你忘了C++ 0x中的新enum類。如果我記得正確的話,精確表述潛在代表性的目的是爲了使它能夠前進。 – 2010-09-27 07:26:01

+0

是否有任何要點向前宣佈部分specializaton?部分專業化在名稱查找期間不可見,並且在模板的實例化處解決 - 在這一點上,它們必須完全定義。 – willj 2013-06-19 18:46:38

+0

@willj允許在某些上下文(前向聲明)中有一個未定義的模板而沒有錯誤,但是在模板被定義時進行實例化。 ADL調用的參數類型與部分特化相關聯是一個示例。如果您沒有轉發聲明,但已經定義了主模板,則主模板將被實例化。 – 2013-06-19 18:50:34