copy함수 오류

qwdxzokm의 이미지

Chain class내부에서 ChainIterator를 따로 만들어서 이와 STL copy함수를 이용해서 Chain의 원소를 배열로 옮기는게 목표인데 처음보는 에러들이 자꾸 떠서 문제네요..

void ChainToArray() {
		int length = 0;
		for (ChainIterator i = begin(); i != end(); i++)
			length++;
		ChainIterator start = begin();
		ChainIterator e = end();
		T* array = new T[length];
		T* a = array;
 
		copy(start, e, a);
 
		for (int i = 0; i < length; i++)
			cout << array[i] << " ";
		cout << endl;
 
	}
	class ChainIterator {
	public:
		ChainIterator(ChainNode<T>* startNode = 0) {
			current = startNode;
		}
		T& operator*() const {
			return current->data;
		}
		T* operator->() const {
			return &current->data;
		}
		ChainIterator& operator++() {
			current = current->link;
			return *this;
		}
		ChainIterator operator++(int) {
			ChainIterator old = *this;
			current = current->link;
			return old;
		}
		bool operator!=(const ChainIterator right) const {
			return current != right.current;
		}
		bool operator==(const ChainIterator right) const {
			return current == right.current;
		}
	private:
		ChainNode<T>* current;
	};
	ChainIterator begin() {
		return ChainIterator(first);
	}
	ChainIterator end() {
		return ChainIterator(0);
	}
private:
	ChainNode<T>* first;
	ChainNode<T>* last;
};

이렇게 짜봣는데
C2672 '_Iter_cat': 일치하는 오버로드된 함수가 없습니다.
C2893 'iterator_traits<_Iter>::iterator_category std::_Iter_cat(const _Iter &)' 함수 템플릿을 특수화하지 못했습니다.
이런 수많은 에러들이 나타나네요.. 고수님들의 도움 부탁드립니다.. ㅠㅠ

 의 이미지

1. 에러 메시지는 프로그래머 괴롭히려고 띄우는 게 아닙니다.

처음 보는 에러메시지가 자꾸 뜬다거나 수많은 에러들이 나타나는 경우, 최소한 그 에러메시지가 뭐라고 말하고 있는지는 한 번 읽어보세요.

STL 관련 에러 메시지가 원래 좀 난해하긴 합니다만, 그래도 일차적으로 문제의 원인을 알 수 있습니다.

2. STL에서 커스텀 iterator iterT를 정의하여 사용할 땐 반드시 그 타입에 대해 특성정보 클래스 iterator_traits<iterT>를 제공해야 합니다.

이는 iterator를 쓰는 쪽에서 iterator의 특성을 알기 위해, 혹은 더 나아가 iterator의 특성에 따라 다르게 동작하는 함수를 작성하기 위해 필요합니다. (ex: bidirectional iterator가 들어왔을 때보다 random access iterator가 들어왔을 때 더 효율적으로 돌아갈 수 있는 알고리즘 등.)

질문자님의 경우에 대해서 말씀드리자면, iterator_traits<ChainIterator>가 제공되어야 하는 거죠.

일단 템플릿 iterator_traits의 정의에 의해, ChainIterator가 멤버 타입으로 difference_type, value_type, pointer, reference, iterator_category을 가지면 iterator_traits<ChainIterator> 역시 정의됩니다.

또한 iterator_traits은 부분 특수화되어 있기 때문에 iterator_traits<T *>이나 iterator_traits<const T *>의 경우에도 잘 정의됩니다. 그래서 STL 알고리즘들에 포인터를 넘겨도 이상 없이 정상 동작하는 것입니다.

iterator_traits 관련 내용이 그렇게 많지는 않은데 그렇다고 여기서 전부 설명드리기는 어려우니 일단은 레퍼런스를 확인 바랍니다.

http://en.cppreference.com/w/cpp/iterator/iterator_traits

쉽게 가려면, 그냥 iterator 템플릿 클래스를 적절히 상속받는 방법도 있는데, C++17 이후로 deprecated라고 하네요.

http://en.cppreference.com/w/cpp/iterator/iterator

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.