2015-03-02 86 views
-1

我有一個聲明模板函數一個庫:模板與正向類聲明

template <typename T> 
void Foo(blah...) 
{ 
    class Bar mybar; 
    ... 
} 

類酒吧是不是在這個庫中定義,但由於它只是一個模板,它不應該在這個時候被實例化;所以通過明確使用class關鍵字,庫成功編譯。

在後面的主程序文件中,我需要實例化此模板,我將該文件包含在Bar類的完整定義中。它使用GCC 4.4.2的工作,但現在升級到了4.8.1,我得到的錯誤:

"Foo(blah...) [with T = blahblah]::Bar mybar has incomplete type" 

好像對待酒吧爲模板的功能,而不是一個轉發類中的臨時類聲明的編譯器。我想知道是否有什麼可以解決這個問題,或者這個技巧不應該起作用?要做到這一點的是,Bar類有很多依賴關係,大多數使用我的庫的程序不需要Bar類,所以沒有必要鏈接Bar類依賴的所有額外庫。

TIA

回答

1

class Bar mybar; 

聲明Bar爲嵌套類的功能模板和 mybar定義爲類型嵌套類Bar的成員變量。它沒有聲明mybar是可能存在於函數模板外部的類Bar的實例。

如果你想mybar是指被函數模板之外定義Bar的一個實例,你需要使用:

class Bar; 

template <typename T> 
void Foo(blah...) 
{ 
    Bar mybar; 
    ... 
} 

更新

下面的程序編譯和構建罰款g++ -Wall -std=c++11

class Bar; 

template <typename T> 
void Foo() 
{ 
    Bar mybar; 
} 

class Bar 
{ 
    public: 
     Bar() {} 
}; 

int main() 
{ 
    Foo<int>(); 
    Foo<double>(); 
} 
+0

已經嘗試過。它甚至不會讓我編譯庫:「非法使用不完整類型」類Bar'「 – Shine 2015-03-02 05:58:00

+0

我很確定這是有效的,但我的問題是我需要編譯lib而沒有類Bar的定義(即,只有你的示例的上半部分),它將在後面定義,但在實例化之前定義。但是非常感謝您的時間!我想我最好放棄並提出一個新的解決方案。 :-) – Shine 2015-03-02 06:11:28

+0

@Shine,你在說什麼lib?代碼的上半部分在語法上是正確的。只有當你實例化函數模板時,你才需要'Bar'。 – 2015-03-02 06:18:17