2011-10-02 67 views
5

喜歡的東西,例如,模板函數的特化可以是虛擬的嗎?

class A { 
    template<typename T> T DoStuff(); 
    template<> virtual int DoStuff<int>() = 0; 
}; 

Visual Studio 2010的說沒有,但我得到的是我只是搞砸語法一種奇怪的感覺。成員函數模板的顯式完全特化可以是虛擬的嗎?

+0

即使你放棄了'虛擬',你仍然應該得到一個錯誤,對吧? –

+1

即使它是合法的。你爲什麼要寫維護者的生活呢?記得他擁有一個斧頭。 –

+0

@ Tux-D:因爲雖然我可以創建大約五種或更多不同類型的DoStuffInt函數,但它並不是真正理想的解決方案,其次,因爲Windows頭文件有十億個宏漏泄問題,所以這可以避免,而一些我的正常函數名稱會有問題。 – Puppy

回答

8

顯式特化在類中是不合法的。即使你可以使它成爲部分專業化,你仍然會遇到「模板不能成爲虛擬」的問題。

n3290,第14.5.2規定:

的成員函數模板不得虛。

而且給出了這樣的例子:

template <class T> struct AA { 
    template <class C> virtual void g(C); // error 
    virtual void f(); // OK 
}; 

去之前就聲明,成員函數模板不用於虛擬覆蓋算過。

+0

你不能部分地專門化一個函數模板。 http://www.gotw.ca/publications/mill17.htm –

+0

@ n.m - 的確如此,那更像是一個假設的「即使」。不過,我會在文中清除它。 – Flexo

0

你可以通過使用常規的非模板虛擬函數重載你的函數模板類似的效果。