c ++ специализация шаблонной функции - неверное количество аргументов шаблона? - PullRequest
3 голосов
/ 11 октября 2011

Хорошо, я только изучаю шаблоны.В любом случае, я, вероятно (совершенно определенно) что-то делаю не так, но вот проблема:

Моя первая функция шаблона объявлена ​​так:

template<typename T>
std::ostream& printFormatted(T const& container, std::ostream& os = std::cout) {
    //...
}

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

template<>
std::ostream& printFormatted<std::map<typename key, typename value>>(std::map<typename key, typename value> const& container, std::ostream& os = std::cout) {
    //...
}

Возможно, я ошибаюсь с моими переменными ключ / значение, не уверен, но независимо от того, при попытке компилирования я получаюсообщение об ошибке:

error: wrong number of template arguments (1, should be 4)
error: provided for ‘template<class _Key, class _Tp, class _Compare, class _Allocator> class std::__debug::map’

Очевидно, что что-то я не понимаю в шаблонах или картах?Кто-нибудь, пожалуйста, помогите?

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Предполагая, что вы используете key и value как заменители места, вы не можете объявить параметры шаблона в строке с ключевым словом typename.То есть, Foo<typename T> всегда недействительно, но не следует ошибаться с Foo<typename T::bar>, который в целом отличается.Синтаксис для специализации выглядит следующим образом:

// Declare template parameters up front
template<typename Key, typename Value>
std::ostream&
printFormatted<std::map<Key, Value> >(std::map<Key, Value> const& container, std::ostream& os = std::cout);

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

template<typename Key, typename Value>
std::ostream&
printFormatted(std::map<Key, Value> const& container, std::ostream& os = std::cout);

Эта перегрузка будет предпочтительнее, чем более общий шаблон.

3 голосов
/ 11 октября 2011

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

template <typename K, typename V, typename Comp, typename Alloc>
std::ostream & printFormatted(const std::map<K,V,Comp,Alloc> & m,
                              std::ostream & o = std::cout)
{
  // ...
}
0 голосов
/ 11 октября 2011

Этот ответ не относится к C ++ 11

Если вы используете компилятор до c ++ 11, вы не можете использовать >> при закрытии вложенногошаблоны.Вам нужен пробел между > с.

C ++ видит >> как токен, отличный от >, и компилятор не использует его для закрытия шаблонов.Вам нужен пробел, чтобы компилятор увидел >, за которым следует >.

Вероятнее всего сработает следующее:

template<>
std::ostream& printFormatted<std::map<typename key, typename value> >(std::map<typename         key, typename value> const& container, std::ostream& os = std::cout) {
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...