2016-10-12 84 views
2

背景正向聲明typdef

我創造一個C++綁定到數據建模語言工作。其中一部分涉及讀取一組類型定義並將其轉換爲C++ typdefs。目前,在我的情況下,大約有100個。

問題

在該文件中,我讀的類型定義是不以任何方式進行排序。所以我最終可能會將類型定義爲另一個尚未定義的類型。

在C++基本問題是這樣的:

typedef typeA typeB; 
typedef typeC typeA; 
typedef double typeC; 

所以,很顯然這是不行的,但我可以向前以任何方式聲明這些?

一種可能的解決方法當然是由我來創建C++文件之前處理這些定義:

typedef double typeC; 
typedef typeC typeA; 
typedef typeA typeB; 

但我的問題仍然是,可我向前聲明typdefs,使這項工作

+0

督察,你需要你的輸入類型定義在拓撲順序 – Rerito

回答

1

你不能轉發聲明typedef,但你可以創建別名爲不完整的類型,如果它有幫助(我不明白到底是什麼問題,但OP提到的事實是他的類型沒有定義 - 被授權認爲他們已被宣佈至少)。
這就是說,我會使用,而不是一個typedef時下一個使用聲明:

typedef A B; 
// Equivalent to 
using B = A; 

下面是其一個別名被創建的正向聲明(不完全)類型的示例:

struct A; 
using B = A; 
B* foo; 
struct A {}; 
int main() { foo = nullptr; } 
+0

+1寧願'using'了'typedef'排序。 ..堅持'typedef'的唯一原因是與舊代碼的兼容性,並且你會放棄使用模板。養成「使用」的習慣 – qxz

+0

我想我理解你的觀點。但是typedef在定義之前沒有聲明(在數據建模語言文件中)。我可以像你說的那樣做,但它不會比簡單的排序typedef簡單。 – remi000

1

不,一個typedef 不能被前向聲明。

類類型,聯合類型,以及使用該classstruct關鍵字時,關鍵字unionenum關鍵字,分別爲(因爲C++ 11)枚舉類型可以是前向聲明。例如

class Foo; // forward declaration 
Foo* make_foo(); 
class Foo { 
    // ... 
}; 

但是,類型定義不能前置聲明,即使你肯定知道該類型是一類,聯合或枚舉。例如,這是不行的:

class Bar { /* ... */ }; 
class Foo; 
typedef Bar Foo; 

的原因是前置聲明Foo隱式聲明它是將由以後class Foo { /* ... */ };定義來定義同一類型,因此它是從所有先前定義的類型不同,所以當你後來說typedef Bar Foo;時,你與前面所說的矛盾。

+0

謝謝。我想我會對所有的typdefs進行排序,並擺脫這個問題! – remi000

0

前向聲明可以使用typedef。但使用

typedef typeA typeB 

typeA應該有向前聲明第一:

struct typeA; 
typedef typeA typeB