2008-11-09 30 views
1

假設我有這樣的代碼:如何克服GCC限制「無法將模板參數'0'轉換爲'Foo *'」?

template<class T, T initial_t> class Bar { 
    // something 
} 

,然後嘗試使用這樣的:

Bar<Foo*, NULL> foo_and_bar_whatever_it_means_; 

GCC撈出錯誤(以上線):

無法將模板參數 '0'轉換爲'Foo *'

我發現這個線程:http://gcc.gnu.org/ml/gcc-help/2007-11/msg00066.html,但我必須在這種情況下使用NULL(好吧,我可能重構 - 但它不會是微不足道的;有什麼建議麼?)。我試圖通過創建一個值爲NULL的變量來克服這個問題,但是GCC仍然抱怨我傳遞變量而不是變量地址作爲模板參數。並且對使用默認ctor初始化的變量的引用不會與NULL相同。

回答

3

反思你的代碼可能是解決它的最好方法。您鏈接的線程包含標準的明確引用,表明這不被允許。

0

你試過:

Bar<Foo*, (Foo*)NULL> foo_and_bar_whatever_it_means_; 

or reinterpret_cast(0)?

+0

兩者都不起作用... – 2008-11-09 13:25:36

2

它似乎是與傳遞字符串文字作爲非類型模板參數相同的問題:它是不允許的。如果對象具有外部鏈接,則允許指向對象的指針作爲模板參數:這用於保證類型的唯一性。

0

@Dan Olson:似乎有一個相當簡單的解決方法。

僅使用一個模板參數創建父類。添加一個返回T的虛函數。對於基類,它應該被硬編碼爲NULL。爲了派生類,它會返回第二個模板參數。

2

要接受Bar<Foo, NULL>,你需要

template <typename T, int dummy> class Bar; /* Declared but not defined */ 
template <typename T> class Bar <T,NULL> { /* Specialization */ }; 

因爲typeof運算(NULL)== INT。

相關問題