배열에서 특정 부분부터 특정 부분까지 특정 내용물을 찾는 함수가 있다고 치고 코드는 아래와 같음


template<typename T1, typename T2>

T1 find(T1 first, T1 last, T2 value) {

while(first != last && *first != value) {

++first;

}

return first;

}




템플릿으로 한 이유는 싱글 리스트에 어떤걸 넣을지 모름. 해당 싱글 리스트는 아래와 같음


template <typename T>

struct Node {

T data;

Node* next;

Node(const T& d, Node* n): data(d), next(n) {}

};




여기서 문제인데 위의 리스트를 이터레이터로 접근하려고 이터레이터를 만든다


template<typename T>

class sList_iterator{

Node<T>* cur;

public:

inline sList_iterator(Node<T>* p) = 0 : cur(p) {}


// 맨 위의 find함수에서 first++를 하기 위해 ++연산자를 만듬

inline sList_iterator& operator++(){

cur = cur->next;

return *this;

}

inline T* operator*() {return current->data;}

inline bool operator==(const sList_iterator* p) {return cur == p.cur;}

inline bool operator!=(const sList_iterator* p) {return cur != p.cur;}

};




이터레이터 만들었으니 그걸 써먹을 리스트를 만들어야겠지?


template<typename T>

class sList{

Node<T>* head;

public:

sList() :head(nullptr) {}


using iterator = sList_iterator<T>;

iterator begin() {return iterator(head);}

iterator end() {return iterator(0);}

};




귀찮아서 타이핑 빼먹은 부분도 있지만 필요한 부분은 다 썼다고 생각해




자 이제 질문이 뭐냐면 


맨 위의 find함수에서 while 내부 보면 ++first가 있단말야?

근데 코드가 정상 작동해

근데 이걸 first++로 바꾸는 순간 컴파일 에러가 남

"sList_iterator<T>'이(가) 이 연산자를 정의하지 않거나 미리 정의된 연산자에 허용되는 형식으로의 변환을 정의하지 않습니다."


분명 ++ 연산에 대해 오버로딩 해줬는데 ++first는 되고 first++는 안되는 부분이 궁금해서 그래

왜 그런거야?


프갤형들 알려주기 귀찮으면 검색어라도 알려줬으면 해!

부탁행 >_<