Я уже перепробовал все, что смог найти при переполнении стека, поэтому, пожалуйста, не отмечайте его как дубликат.
У меня есть файл .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;
}