Специализированная функция-член шаблона для обработки аргументов как std :: string, так и char [] - PullRequest
2 голосов
/ 05 марта 2012

У меня есть функция-член класса, которую я использую для добавления различных типов в список, со специальной обработкой и переносом (все заканчивается в объекте var) для определенных типов:

template<typename V> const var& addvar(const V& v);

template<> const var& addvar<std::string>(const std::string& v) {/*stuff*/}

Однако я передаю строки (ну, константные массивы символов) вот так:

object.addvar("lol");

Хотя я обрабатываю все как std :: strings, это появляется как ссылка на массив const char в выводе типа параметра шаблона. Таким образом, я получаю сообщение об ошибке, не имеющую для него функции, даже с учетом специализации std :: string. Я знаком с выводом размера массива шаблонов, поэтому я пытаюсь использовать этот формат для создания addvar, который может обрабатывать такие вещи, например:

template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}

Но дела с ошибками компилятора о нелегальных массивах ссылок идут ужасно. Это в VC ++ 2010, если есть какая-то особенная странность с этим, но у меня такое ощущение, что я здесь что-то путаю.

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

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

template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/}
1 голос
/ 05 марта 2012

Функция будет выглядеть следующим образом:

template <std::size_t N>
void foo(const char (&a)[N])

Но ваша проблема в том, что вы не можете частично специализировать функцию.Что вы можете сделать, так это определить простую перегрузку, которая будет предпочтительнее и вызывается из компилятора.

1 голос
/ 05 марта 2012
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
                                                     ^

Удалить & после const char, вы пытаетесь специализироваться для массива ссылок таким образом, а это не то, что вы хотите (и в любом случае недопустимо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...