2012-06-11 33 views
1

如果我模板,在C++函數的返回類型:如何有條件地編譯模板函數在返回類型

template<class T> T foo(int x) { }; 

我可以使用顯式模板特創建double實例:

template<> double foo<double>(int x) { }; 

我試圖使用前向聲明來創建未定義的實例:struct

struct bar; 
template<> bar foo<bar>(int x) { } 

此失敗,error: return type ‘struct bar’ is incomplete。我想認爲這將被允許,即使在閱讀When to use forward declaration?的接受答案之後,因爲直到我創建了foo<bar>的實例,從未創建明確的模板代碼。顯然情況並非如此(爲什麼不呢?)。

是否有可能在編譯時有類型可能不存在的函數的代碼,並且只有在特定的顯式特化被實例化時才編譯代碼?其動機是一個「重載」的結構讀取器,其中過載操作是在編譯之前(通過腳本)程序化生成的。

+0

您能否讓腳本生成專門化? –

+0

我認爲編譯錯誤是因爲你的函數返回一個編譯器一無所知的條(不僅僅是一個指向條的指針或引用)。你可能需要做一些預處理器的東西,但我並不確定。 – NKamrath

回答

2

當你定義您所定義的功能,不是函數模板功能的專業化。此時的規則與任何常規函數的規則完全相同,因爲您使用的類型需要完整的類型,所以缺少bar的定義會使您的程序不合格。

(缺少return語句也會使程序不合格...)

2

你可以做到這一點,如果你不提供foo函數體:

// some header file, probably 
struct bar; 
template<> bar foo<bar>(int x); 

// somewhere else: 

struct bar { 
    //blabla 
}; 

// the actual implementation 
template<> bar foo<bar>(int x) { 
    // do something 
} 

向前聲明僅適用,如果你不實際需要的bar定義。在您的foo函數的正文中,您需要知道該結構的大小,這就是您的代碼無法工作的原因。

相關問題