2012-05-17 63 views
0
template <typename T> 
void foo(T t) 
{ 
    ... // do stuff with type T 
} 

template <typename T> 
class class_template 
{ 
    // class body 
}; 

template<>      // failed attempt at full specialization 
void foo(class_template<T> t) // which doesn't work of course 
{ 
    //full specialization for all classes of class_template 
} 

在上面的代碼中,我該如何顯式地將函數foo與類模板進行專門化?如何使用類模板完全專用函數模板?

+1

這裏的矛盾是,如果它是「對所有class_template類」,那麼它不是「完全專業化」。根據定義,完全專業化僅適用於每個模板參數的* 1個可能的值。 –

+0

你的嘗試有'template <>'但是然後使用未聲明的模板參數'T',它不能工作,什麼是'T'?正如前面的評論所說,你使用了錯誤的術語,你想要做的是**部分**專門化功能模板,這是不允許的。 –

回答

1

在上面的代碼中,我如何顯式地使用類模板專門化函數foo?

你不行。這是部分專業化的重點。但它們不適用於功能。

有兩種解決方法:

  • 超載的功能。這通常起作用。
  • 將作品提交給班級模板,其中可以是部分專業化。也就是說,在你的函數中,調用一個類模板中的(靜態)函數,並專門
+0

我不認爲我有任何選擇,因爲我的函數foo是std :: swap。 – hawk

+0

@hawk:因爲您仍然需要模板參數。例如,'template <> void foo >(class_template t)'是合法的,因爲它不再具有模板參數。你想說什麼,「對於所有class_templates,做到這一點」,而不是。 –

+1

@hawk在本地命名空間中重載'std :: swap'。這是首選方式。 –