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

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

.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), и он связывает без проблем. Похоже, локальная ошибка или поврежденная установка.

2

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]