2012-04-14 4 views
3

Основываясь на tutorial,синтаксиса функция Явной специализации

// 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*){;} 

Но это НЕ вопрос, который я задаю :)

Спасибо

+0

В чем вопрос? –

+0

Я обновил свой вопрос. – q0987

+0

Первый метод как шаблон <> void f <> (int *) 'vs method two как' template <> void f (int *) '? – Griwes

ответ

1

Полная декларацию специализации можно опустить явные шаблонные аргументов, когда шаблон специализируясь можно определить с помощью аргумента дедукции (с использованием в качестве типов аргументов типов параметров предусмотрены в объявлении) и частичный порядок. [Из «C++ шаблонов» по Vandervoode, Josuttis]

этого дела в вашем примере, так что вы можете написать:

template<> 
void f(int){;} 

специализироваться (а) и

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

специализация (b).

Смежные вопросы