Неопределенные символы в шаблоне (весь код уже в заголовке) - PullRequest
1 голос
/ 26 апреля 2020

Я уже перепробовал все, что смог найти при переполнении стека, поэтому, пожалуйста, не отмечайте его как дубликат.

У меня есть файл .h со всем, что внутри, и декларацией, и реализацией. У меня есть основной класс DynamicArray, который должен иметь два класса внутри (iterator и const_iterator), которые были перемещены, чтобы иметь возможность пересылать объявление, потому что им нужно, например, operator+, где первый аргумент int.
Это объявление:

template<class T> class DynamicArray;
template<class T> class iterator;
template<class T> class const_iterator;
template<class T>const_iterator<T> operator+(const const_iterator<T>& iter, int  diff);
template<class T>const_iterator<T> operator+(int  diff, const const_iterator<T>& iter);
template<class T>const_iterator<T> operator-(int  diff, const const_iterator<T>& iter);
template<class T>const_iterator<T> operator-(const const_iterator<T>& iter, int  diff);
template<class T> iterator<T> operator+(const iterator<T>& iter, int  diff);
template<class T> iterator<T> operator+(int  diff, const iterator<T>& iter);
template<class T> iterator<T> operator-(int  diff, const iterator<T>& iter);
template<class T> iterator<T> operator-(const iterator<T>& iter, int  diff);

После этого все реализовано (это часть кода):

template<class T>
iterator<T> operator+(const iterator<T> &iter, int diff) {
    return iterator(iter.arr, iter.pos + diff);
}

template<class T>
iterator<T> operator+(int diff, const iterator<T> &iter){
    return iter + diff;
}

template<class T>
iterator<T> operator-(int diff, const iterator<T> &iter) {
    return iter + -diff;
}

template<class T>
iterator<T> operator-(const iterator<T> &iter, int diff) {
    return iter + -diff;
}

template<class T>
const_iterator<T> operator+(const const_iterator<T> &iter, int diff) {
    return const_iterator(iter.arr, iter.pos + diff);
}

template<class T>
const_iterator<T> operator+(int diff, const const_iterator<T> &iter) {
    return iter + diff;
}

template<class T>
const_iterator<T> operator-(int diff, const const_iterator<T> &iter) {
    return iter + -diff;
}

template<class T>
const_iterator<T> operator-(const const_iterator<T> &iter, int diff) {
    return iter + -diff;
}

Однако , когда я пытаюсь скомпилировать, я получаю ошибку компоновщика, говорящую:

Undefined symbols for architecture x86_64:
  "operator-(iterator<int> const&, int)", referenced from:
      _main in main.cpp.o
      iterator<int> DynamicArray<int>::emplace<int>(const_iterator<int> const&, int&&) in main.cpp.o

и некоторую другую ошибку компоновщика, все относительно friend operator двух итераторов ... что я делаю неправильно?

НЕБОЛЬШОЙ КОД ДЛЯ РЕПРОДУКЦИИ:

template<class T> class const_iterator;
template<class T>const_iterator<T> operator-(const const_iterator<T>& iter, int  diff);

template<class T>
class const_iterator  {
public:
    friend const_iterator operator-(const const_iterator& iter, int  diff);
    const_iterator(const int* container, unsigned int position) :
            arr(container),
            pos(static_cast<int>(position))
    {}
private:
    const int* arr;
    int pos;

};

template<class T>
const_iterator<T> operator-(const const_iterator<T> &iter, int diff) {
    return iter + -diff;
}

int main() {
    const_iterator<int> it(new int, 4);
    it -4;
}

1 Ответ

2 голосов
/ 26 апреля 2020

Спасибо @bruno за сообщение о том, в чем проблема.
Отношения friend относились к не шаблонному оператору, однако мои операторы были по шаблону, поэтому мне просто нужно было <> после операторов:

template<class T>
class const_iterator{
    friend iterator operator-<>(const iterator& iter, int  diff);
    // instead of
    // friend iterator operator-(const iterator& iter, int  diff);
}
...