У меня есть класс отладки, который я использую в своем коде для печати различных вещей. В этом классе я перегружаю 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<<()
.