2010-10-07 92 views
114
​​

並在我的主要使用該功能。我收到錯誤。當然,我知道std::list(我認爲是分配器)有更多的模板參數。但是,這是重要的。我是否必須知道模板類的完整模板聲明才能夠轉發聲明它?如何在名稱空間std中轉發聲明模板類?

編輯:我以前沒有使用指針 - 這是一個參考。我會用指針試一試。

+0

而在列表的情況下,第二個參數是一個默認參數,它是'std :: allocator ' – nakiya 2010-10-07 06:42:08

+2

可以認爲它是一個疏忽,STL不包含前向聲明頭。另一方面,它的文件經常包含在編譯時間內可能不會帶來任何好處... – 2010-10-07 07:02:40

+6

'__TEST__'是一個保留的標識符,[不要使用它](http://stackoverflow.com /問題/ 228783 /什麼,是最規則有關,使用-的下劃線,在-AC-標識符)。 – GManNickG 2010-10-07 08:41:50

回答

116

問題不在於您無法轉發聲明模板類。是的,你需要知道所有的模板參數及其缺省值,才能夠正確轉發,它聲明:

namespace std { 
    template<class T, class Allocator = std::allocator<T>> 
    class list; 
} 

但是,爲了使即使是這樣在namespace std向前聲明明確標準禁止:只有你允許放入的東西std是一個模板專業,通常是std::less在用戶定義的類型。如有必要,其他人可以引用相關文本。

只需#include <list>,不用擔心。

哦,順便說一句,任何包含雙下劃線的名字都會被保留供實現使用,所以您應該使用類似TEST_H而不是__TEST__。它不會生成警告或錯誤,但是如果程序與實現定義的標識符發生衝突,則不能保證編譯或運行正確:它是不合格的。還禁止使用以下劃線開頭的名稱,後面跟着大寫字母等等。一般來說,除非你知道你在處理什麼魔法,否則不要用下劃線開始。

+0

感謝您的提示! – nakiya 2010-10-07 06:44:48

+3

爲什麼禁止在'namespace std'中轉發聲明的東西? – nakiya 2010-10-07 06:46:06

+4

看看這個答案(http://stackoverflow.com/questions/307343/forward-declare-an-stl-container/307408#307408)和鏈接的新聞組討論。 – 2010-10-07 06:49:30

9

前向聲明應該指定完整的模板參數列表。

20

我解決了這個問題。

我正在爲C++(Eclipse Juno)中的網絡仿真實施OSI層(滑塊窗口,2級)。我有幀(模板<class T>)及其狀態(狀態模式,前向聲明)。

該解決方案如下:

*.cpp文件中,必須包含頭文件,你前進,即

ifndef STATE_H_ 
#define STATE_H_ 
#include <stdlib.h> 
#include "Frame.h" 

template <class T> 
class LinkFrame; 

using namespace std; 

template <class T> 
class State { 

    protected: 
    LinkFrame<int> *myFrame; 

} 

其CPP:

#include "State.h" 
#include "Frame.h" 
#include "LinkFrame.h" 

template <class T> 
bool State<T>::replace(Frame<T> *f){ 

而且...另一班。

+18

在頭文件中放置任何'使用名稱空間'是一種非常糟糕的做法,因爲它會阻止任何使用該頭文件的人能夠使用否則會有效的本地名稱。它基本上擊敗了命名空間的整個點。 – 2016-02-23 06:37:59

-4

有你可以用有限的替代

頭:

class std_int_vector; 

class A{ 
    std_int_vector* vector; 
public: 
    A(); 
    virtual ~A(); 
}; 

CPP:

#include "header.h" 
#include <vector> 
class std_int_vector: public std::vectror<int> {} 

A::A() : vector(new std_int_vector()) {} 
[...] 

在實際程序沒有經過測試,所以希望它是不完美的。