2017-02-03 3 views
1

Предположим, что мы имеем следующий шаблон класса:Шаблоны классов и явная специализация функций

template<typename T, size_t m, size_t n> 
    class Matrix { 
    /* Implementation/Declaration is probably irrelevant and has been omitted. */ 
    }; 

Я хочу специализироваться определенную функцию для моего класса шаблона.

template<> template<typename T, size_t m, size_t n> 
inline std::wstring Microsoft::VisualStudio:CppUnitTestFramework::ToString(const Matrix<T, m, n> &mtrx) { 
    /* Definition omitted */ 
} 

(И да, функция Я, специализирующимся реальная функция, которая не должна быть слишком трудно найти.)

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

C2244: 'ToString': unable to match function definition to an existing declaration 

поскольку люди неизбежно будут просить об этом, я мог бы также включать прототипы функции I 'm, специализирующийся:

template <typename Q> static std::wstring ToString (const Q& q); 

И у меня нет проблем с его специализацией с классами без аргументов шаблона (например, std :: string).

+0

Избавьтесь от 'template <>'. –

+0

Я уже пробовал это. Это не работает. (Точное одно и то же сообщение об ошибке.) – Isaiah

+0

Вы объявили его первым в пространстве имен? –

ответ

1

Вы не хотите специализации - нет такой вещи, как частичная специализация шаблонов функций. Вместо этого вам нужна перегрузка. И перегрузка не может быть определена за пределами пространства имен - вам нужно снова открыть пространство имен. Что-то вроде этого:

namespace Microsoft { 
namespace VisualStudio { 
namespace CppUnitTestFramework { 

template<typename T, size_t m, size_t n> 
std::wstring ToString(const Matrix<T, m, n> &mtrx) { 
    /* Definition omitted */ 
} 

}}} // end namespaces 
Смежные вопросы