Отдельное объявление и определение специализации шаблонной функции: различное поведение для функций-членов и не членов

Я хочу объявить специализацию для шаблона функции, но определю это позже в исходном файле. Рассмотрим следующий пример:

.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 (CTP не установлен) оба варианта компилируются нормально, но вариант без члена (# 1) вызывает ошибки компоновщика (неразрешенные внешние проблемы, бла). Это нормальное поведение? MSVC конкретный? Ошибка компилятора? Исправлено в CTP?

РЕДАКТИРОВАТЬ
Я использую только специализированные версии. Они объявлены в заголовках и определены в источниках. Этот подход работает для членов, но не работает для автономных функций.

РЕДАКТИРОВАТЬ 2
Хм... Я пытаюсь создать такой же снимок дома (идентичная установка MSVC, без CTP), и он связывает без проблем. Похоже, локальная ошибка или поврежденная установка.

1 ответ

Шаблон функции не является функцией. Полностью специализированный шаблон функции является функцией.

Поскольку все (используемые 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";
}
Другие вопросы по тегам