- 32 или 64 битным
- ASCII или Unicode
template <typename T>
class someclass
{
public:
template <typename W> void somefunction(const W* filename);
private:
template <typename W> const char *get_format_string(int index) const;
};
Тут все просто и очевидно - первый template задает размерность, второй - сhar или wchar_t. Метод get_format_string зовется из somefunction для получения правильных форматных строк для printf например. Заметьте при этом что сам get_format_string не имеет аргументов типа W и вообще служит исключительно для специализации:
template <typename T>
template <typename W>
void someclass<T>::somefunction(const W *filename)
{
...
// вызываем get_format_string
printf(get_format_string<W>(FORMAT_INDEX1), args);
}
Это компилируется.
Проблема возникает при попытке определить частично специализированный метод get_format_string. Например такое не работает:
template <typename T>
template <>
const char *someclass<T>::get_format_string<char>() const
при компиляции возникает ошибка C2768
И как же будет правильно специализировать такой метод шаблонного класса ?
Update: гугл говорит нам что "частичная специализация шаблонной функции шаблонного класса в чистом виде невозможна" и предлагает использовать костыли в виде traits и прочую boostоподобную упячку. Реальность однако подсказывает что вот такой код, вставленный внутри определения класса, вполне даже работает:
template <typename W>
const char *get_format_string(int index) const;
template <>
const char *get_format_string<wchar_t>(int index) const
{
// тело специализированного метода например
}
vs2008 есличо
У меня есть подозрения что главная гордость с++ - шаблоны - на самом деле реализованы в нем крайне через
Комментариев нет:
Отправить комментарий