Я смешиваю переопределение операторов с шаблонными классами и достигла следующего назначения:
j = end - begin;
в моей основной функции, где типы переменных следующие:
ptrdiff_t j;
util::BaseArrayIterator<int, 6> begin, end;
Beginи end были инициализированы из util :: BaseArray:
util::BaseArray<int, 6> ba(SOME_PARAMETERS);
begin = ba.begin(); end = ba.end();
BaseArrayIterator является самореализуемым типом итератора.
Я получаю ошибку:
TestProject.obj : error LNK2019: unresolved external symbol
"int __cdecl util::operator-(class util::BaseArrayIterator<int,6>
const &,class util::BaseArrayIterator<int,6> const &)"
(??Gutil@@YAHABV?$BaseArrayIterator@H$05@0@0@Z) referenced in
function _main
из-за первого оператора кода в сообщении (удаление устраняет проблему).
Я включил заголовочный файл со следующими определениями и объявлениями:
namespace util {
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -
(const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR);
...
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -(
const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR)
{ return -(itL.m_cnt - itR.m_cnt);
}
}
В чем причина проблемы?Компилятор сообщает о поиске util :: operator -, поэтому он нашел объявление, но не определение, хотя они находятся в одном файле.И я не вижу ошибки подписи.
--- РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ -----------------------------------------------------------------------------
Замена
end-begin
на
util::operator-<int, 6>(end,begin)
решает проблему, но я не хочу явно указывать параметры каждый раз.Сокращение - один из основных аргументов в пользу оператора перегрузки, поэтому я хотел бы использовать классическую краткую форму.
--- РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ 2 ---------------------------------------------------------------------------
Как любезно указал Никола Муссатти, [решение]: Неразрешенный внешний символ с перегрузкой оператора и шаблонами к проблеме находится здесь.Объявление друга должно быть перенесено в класс.
Так я и сделал, и все улыбаются.Теперь их разделение снова приводит к неоднозначным проблемам с перегрузкой, что не является той же ошибкой, что и раньше.