2010-04-29 64 views
2

我的理解是,專業化的聲明或typedef應該使模板類實例化,但這似乎並沒有出現在gcc中。例如。我有一個模板類,模板類Foo {};顯式模板實例化的gcc問題?

我寫

class Foo<double>; 

typedef Foo<double> DoubleFoo; 

但編譯後生成的目標文件的符號表不包含富的成員。

如果我創建一個實例

Foo<double> aFoo; 

那當然符號全部產生。

有沒有其他人經歷過這個和/或有解釋?

回答

6

爲顯式實例的語法

template class Foo<double>; 

見C++ 03§14.7.2。

希望函數得到生成和鏈接,但在創建但不使用實例(最小的隱式實例化)後不會被剝離,這是相當大的賭博。

+1

我認爲Potatoswatter是在這裏的東西。我從來沒有聽說過typedef的這種用法。這僅適用於shorthanding類型,並且從不實例化任何內容。 – daramarak 2010-04-29 16:16:03

+0

是的,你是對的,我不確定我在哪裏找到有關typedefs的錯誤信息。我的聲明正處於正確的軌道上,但沒有提供關鍵的「模板」關鍵字。 謝謝 – 2010-04-29 16:22:35

0

您正在談論隱式實例化。但是,只有當類類型的完整性會影響程序的語義時纔會發生這種情況。

在你的情況下,類的類型不需要是完整的,因爲你typedef的類型可以保持不完整(不需要類體,所以不需要實例化它)。爲了說明,你也可以在自己的聲明中說typedef class MyFunnyThing type;,而不必在任何地方定義該類。

如果你創建一個對象,它的類型必須完整,所以類模板被隱式地實例化。請注意,類模板的隱式實例化不會隱式地實例化成員函數或靜態數據塊定義,除非它們在別處明確使用。

此外,聲明一個類模板的專業化,整點防止的實例發生,告訴編譯器「不要實例,因爲後來我明確專攻它」。聲明如果你的專業化也沒有在它前面的template<>