Конечно: просто не определяйте его, и вы получите ошибку компоновщика, если попытаетесь его использовать:
template <typename T>
void foo(); // not defined
template <>
void foo<int>() { }
В качестве альтернативы, вы можете использовать некоторую вариацию статического утверждения, чтобы получить "приятнее "ошибка времени компиляции.Вот пример использования C ++ 0x static_assert
.Обратите внимание, что вы должны сделать значение false
зависимым от параметра шаблона, в противном случае static_assert
может сработать при разборе шаблона.
template <typename T>
struct dependent_false { enum { value = false }; };
template <typename T>
void foo()
{
static_assert(dependent_false<T>::value, "Oops, you used the primary template");
}
Обратите внимание, что обычно лучше не специализироватьшаблоны функций .Вместо этого лучше делегировать специализированный шаблон класса:
template <typename T>
struct foo_impl
{
static_assert(dependent_false<T>::value, "Oops, you used the primary template");
};
template<>
struct foo_impl<int>
{
static void foo() { }
};
template <typename T>
void foo()
{
return foo_impl<T>::foo();
}