[C++] Синтаксически верно описать шаблон

erotic

Есть шаблонный класс, у него внутри шаблонная функция и специализация:
 
template <class T, int Dim>
class Base
{
public:
template<class T1> set(const T1*);
template<> set(const T*);
}

Первая функция set нормально компилируется
 
template <class T, int Dim> template <class T1>
void Base::set(const T1* arr)
{
// do something
}

на вторую ругается разными вариантами
 
template <class T, int Dim> template <>
void Base::set(const T* arr)
{
// do something
}

Не ругается, если описать вот так:
 
template<> template <class T, int Dim>
void Base::set<T>(const T* arr)
{
// do something
}

но тогда он эту специализацию не использует и вообще никогда не компилирует.
Нормально он ее компилит и юзает, если описать тело функции в момент ее объявления в теле класса.
Как все-таки можно определить ее тело внешним образом?

mira-bella

убери просто этот template<> отовсюду и будет щастье
никогда не понимал нафига делать специализации шаблона функции

erotic

Не канает. Я не знаю как объяснить следующий феномен:
Есть еще функция set(unsigned char count, ...)
Если предыдущее объявление делать без template<>, то тогда вызов set(0) становится неопределенным - то ли 0 это unsigned char, то ли это T*.
Если делать как специализацию шаблона, то каким-то чудесным образом при вызове set(0) вызывается именно set(unsigned char count, ... что мне и нужно, собственно.

mira-bella

да верно
но вот только не писал бы ты лучше таких ужасных вещей как set(0)
0 в качестве параметра вызовет конфликт при любой перегрузке функции (без шаблонов) с одинаковым числом аргументов, а следовательно имхо - это отстойная практика в любом случае.
не только для компилятора должно быть очевидно какую функцию использовать, но и для читателя
почему не написать было например unsigned(0) вместо 0?

erotic

Мдя, ты прав. Сам потом не разберу, что имел ввиду...
Оставить комментарий
Имя или ник:
Комментарий: