3

根据教程,</p>

// Example 2: Explicit specialization 
// 
template<class T> // (a) a base template 
void f( T ){;}

template<class T> // (b) a second base template, overloads (a) 
void f( T* ){;}     //     (function templates can't be partially 
//     specialized; they overload instead)

template<>        // (c) explicit specialization of (b) 
void f<>(int*){;} // ===> Method one

我还使用 VS2010 SP1 测试了以下内容,没有任何警告。

template<>        // (c) alternative
void f<int>(int*){;} // ==> Method two

问题> 根据 C++ 标准推荐哪种方式?方法一还是方法二?

如您所见,方法一和方法二的主要区别如下:

template<>        
void f<>(int*){;}    // ===> Method one

template<>        
void f<int>(int*){;} // ===> Method two
       ^^^

根据教程,我们应该编写以下普通的旧函数:

void f(int*){;}

但这不是我要问的问题:)

谢谢

4

1 回答 1

1

当模板被特化可以通过参数推导(使用声明中提供的参数类型作为参数类型)和部分排序来确定时,完整的特化声明可以省略显式模板参数。 [来自 Vandervoode,Josuttis 的“C++ 模板”]

在您的示例中就是这种情况,因此您可以编写:

template<>
void f(int){;}

专攻 (a) 和

template<>
void f(int*){;}

专攻 (b)。

于 2012-04-14T18:59:26.350 回答