배열에서 특정 부분부터 특정 부분까지 특정 내용물을 찾는 함수가 있다고 치고 코드는 아래와 같음
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++는 안되는 부분이 궁금해서 그래
왜 그런거야?
프갤형들 알려주기 귀찮으면 검색어라도 알려줬으면 해!
부탁행 >_<
물론 컴파일러 오류 C2676 - MSDN 여거 읽어봤지만 도움은 되지 않았어
MSDN을 읽고 공부를 하도록 합시다 -
https://msdn.microsoft.com/ko-kr/library/f6s9k9ta.aspx
아! 연산자 오버로딩 pre, post를 & 붙이냐 안붙이냐였군! 고마워요!
http://lgstar.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다. - DCW