Шаблон Специализация для функции без параметров

Мне нужно специализировать шаблон функции в c++.

template<typename T>  
void doStuff<T>() {}

к

template<>
void doStuff<DefinedClass>();

а также

template<>
void doStuff<DefinedClass2>();

Я предполагаю, что это не правильный синтаксис (поскольку он не компилируется). Как я должен это делать?
Кроме того, поскольку у меня не будет неопределенных параметров шаблона в doStuff<DefinedClass>, можно ли объявить тело в.cpp?

Примечание: doStuff будет использовать T wihtin в своем теле, чтобы объявить переменную.

Ответ 1

Основной шаблон не получает вторую пару аргументов шаблона. Просто это:

template <typename T> void doStuff() {}
//                        ^^^^^^^^^

Только специализации имеют как template <> спереди, так и <...> после имени, например:

template <> void doStuff<int>() { }

Ответ 2

Правильный синтаксис для основного шаблона:

template <typename T>
void doStuff() {}

Чтобы определить специализацию, сделайте следующее:

template <>
void doStuff<DefinedClass>() { /* function body here */ }

Ответ 3

Я предполагаю, что это не правильный синтаксис (поскольку он не компилируется). Как я должен это делать? doStuff будет использовать T wihtin в своем теле, чтобы объявить переменную.

template<typename T>  
void doStuff() 
{
  T t = T();   // declare a T type variable

}

можно было бы объявить тело в.cpp?

C++ поддерживает только inclusive mode, вы не можете его компилировать отдельно, а затем ссылаться позже.

Из комментария, если вы хотите специализироваться на тип int:

template<>
void doStuff<int>()
{
}