Я хочу объявить специализацию для шаблона функции, но определю это позже в исходном файле. Рассмотрим следующий пример:
.hpp
// approach #1
template <typename T> const char *GetTypeName();
template <> const char *GetTypeName<int>();
// approach #2
template <typename T> class TypeName {static const char *Get();};
template <> const char *TypeName<int>::Get();
.cpp
// approach #1
template <> const char *GetTypeName<int>()
{
return "int"}
// approach #2
template <> const char *TypeName<int>::Get()
{
return "int"}
В MSVC 2012 (ОСАГО является не установлено), оба варианта компилируются нормально, но вариант без членов (# 1) вызывает ошибки компоновщика (неразрешенные внешние проблемы, бла). Это нормальное поведение? MSVC конкретный? Ошибка компилятора? Исправлено в CTP?
РЕДАКТИРОВАТЬ
Я использую только специализированные версии. Они объявлены в заголовках и определены в источниках. Этот подход работает для членов, но не работает для автономных функций.
РЕДАКТИРОВАТЬ 2
Хм … Я пытаюсь создать такой же снимок дома (идентичная установка MSVC, без CTP), и он связывает без проблем. Похоже, локальная ошибка или поврежденная установка.
Шаблон функции не является функцией. Полностью специализированный шаблон функции является функция.
Поскольку все (используемые odr) функции должны быть определены, у вас должен быть способ генерировать определения для произвольных экземпляров шаблона. Таким образом, определение шаблона основной функции должно быть в заголовке.
header.h:
template <typename T> // this
const char * GetTypeName() // is
{ // not
return "foo"; // a
} // function
template <>
const char * GetTypeName<int>();
impl.cpp:
#include "header.h"
template <>
const char * GetTypeName<int>()
{
return "int";
}
Других решений пока нет …