Печать содержимого любого вектора - PullRequest
1 голос
/ 27 февраля 2012

У меня есть класс отладки, который я использую в своем коде для печати различных вещей. В этом классе я перегружаю operator() для облегчения вывода. У меня есть несколько operator() для печати векторов. Когда я добавил шаблонную версию, я столкнулся с ошибками компиляции.

Вот код:

  template<class Type1>
    inline debug&
    operator()(const std::string& name,
               typename std::vector<Type1>::const_iterator begin,
               typename std::vector<Type1>::const_iterator end)
    {    
      _stream << indent(internal) << "< " << name << " : [ ";
      std::copy(begin, end, std::ostream_iterator<Type1>(_stream, " "));
      _stream << "] >" << std::endl;

      return *this;
    }

И еще одна функция векторной печати, которую я имею:

  inline debug&
  operator()(const std::string& name,
             typename std::vector<uint32_t>::const_iterator begin,
             typename std::vector<uint32_t>::const_iterator end)
  {
    _stream << indent(internal) << "< " << name << " : [ " << std::hex;
    std::copy(begin, end, std::ostream_iterator<uint32_t>(_stream, " "));
    _stream << "] >" << std::endl;

    return *this;
  }

Где indent() делает именно то, что говорит.

Вот ошибка компиляции:

../include/debug.hh:146:3: note: template<class Type1> relix::debug&    relix::debug::operator()(const string&, typename std::vector<_RealType>::const_iterator, typename std::vector<_RealType>::const_iterator)
../include/debug.hh:146:3: note:   template argument deduction/substitution failed:
assembler.cc:78:64: note:   couldn't deduce template parameter ‘Type1’

Вот ассемблер.cc:78:

  log(D_C(tl._tokens), tl._tokens.begin(), tl._tokens.end());

Где D_C() - это макрос препроцессора замещения для извлечения имени переменной, а _tokens - это std::vector из token, где token имеет перегруженный operator<<().

1 Ответ

2 голосов
/ 27 февраля 2012

Проблема только с шаблоном:

template<class Type1>
inline debug&
operator()(const std::string& name,
           typename std::vector<Type1>::const_iterator begin,
           typename std::vector<Type1>::const_iterator end)
{    
// ...

Проблема здесь в том, что Type1 не может быть выведен компилятором.Рассмотрим, что необходимо для фактического вывода типа: Компилятор должен будет создать экземпляр std::vector с всеми возможными типами, включая любое потенциальное создание экземпляра std::vector, чтобы определить, является ли аргумент функции совпадающим.

Самый простой обходной путь - исключить vector из явных требований в сигнатуре и преобразовать его в:

template<class Iterator>
inline debug&
operator()(const std::string& name,
           Iterator begin,
           Iterator end)
{    
// ...

Теперь тип можно тривиально определить независимо от аргумента аргументафункция есть.

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