이거 어디가 잘못 되었는지 봐주시기 바랍니다.

puaxx의 이미지

     39 template<class From, class To>
     40 class RangeMapIter {
     41 private:
     42   size_t count_ ;
     43   typename Vector<RangeMapRange<From,To> >::const_iterator ptr_ ;
     44
     45 public:
     46   RangeMapIter(const RangeMap<From,To> &map);
     47   Boolean next(From &fromMin, From &fromMax, To &toMin) {
     48     if (!count_)
     49       return 0;
     50     else {
     51       fromMin = (ptr_)->fromMin;
     52       fromMax = (ptr_)->fromMax;
     53       toMin = (ptr_)->toMin;
     54       (ptr_)++;
     55       count_--;
     56       return 1;
     57     }
     58   }
     59 };

컴파일 하면 위의 단락에서 아래와 같은 에러가 출력됩니다.제가 C++은 잘몰라서 어디가 잘못된건지 모르겠습니다..

컴파일러 버전 : gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)

이게 2.95 에서는 무리없이 컴팔했는데...다른 시스템에서 하려니 안되네요.

../include/RangeMap.h: At global scope:
../include/RangeMap.h:43: error: expected `;' before "ptr_"
../include/RangeMap.h: In member function `Boolean RangeMapIter<From, To>::next(From&, From&, To&)':
../include/RangeMap.h:51: error: `ptr_' undeclared (first use this function)
../include/RangeMap.h:51: error: (Each undeclared identifier is reported only once for each function it appears in.)
doldori의 이미지

Vector, RangeMapRange 등의 클래스가 적절히 정의되었다고 가정한다면
문제 없는 코드로 보입니다.

익명 사용자의 이미지

typename Vector<RangeMapRange<From,To> >::const_iterator ptr_ ;

에서 ::const_iterator 부분을 빼주니 컴파일이 되다가 아래와 같이 에러가 나옵니다.

UnivCharsetDesc.cxx:166:   instantiated from here
../include/RangeMap.h:52: error: base operand of `->' has non-pointer type `Vector<RangeMapRange<WideChar, UnivChar> >'
../include/RangeMap.h:53: error: base operand of `->' has non-pointer type `Vector<RangeMapRange<WideChar, UnivChar> >'
../include/RangeMap.h:54: error: base operand of `->' has non-pointer type `Vector<RangeMapRange<WideChar, UnivChar> >'
../include/RangeMap.h:55: error: no `operator++(int)' declared for postfix `++', trying prefix operator instead
../include/RangeMap.h:55: error: no match for 'operator++' in '++((RangeMapIter<WideChar, UnivChar>*)this)->RangeMapIter<WideChar, UnivChar>::ptr_'

     17 template<class From, class To>
     18 struct RangeMapRange {
     19   From fromMin;
     20   From fromMax;
     21   To toMin;
     22 };

위에는 스트럭쳐 정의 부분입니다..

뭐가 잘못된걸까요?

mr.lee의 이미지

puaxx wrote:
     46   RangeMapIter(const RangeMap<From,To> &map);

RangeMap 클래스의 정의와 RangeMapIter 생성자의 정의가 어떻게 되어 있는지요.

저기서 ptr_ 은 타입을 private 멤버로 갖고 있는거지 iterator자체가 할당된건 아닌 상태라고 봐집니다만. 차라리,

Vector<RangeMapRange<From,To> >::const_iterator ptr_

가 되어야 하는것 같은데. 아님 typedef를 활용하시던지...

doldori의 이미지

SaNha wrote:
저기서 ptr_ 은 타입을 private 멤버로 갖고 있는거지 iterator자체가 할당된건 아닌 상태라고 봐집니다만. 차라리,

Vector<RangeMapRange<From,To> >::const_iterator ptr_

가 되어야 하는것 같은데.


typename을 빼면 문법 에러입니다. (Vector 클래스에서 const_iterator라는 형이
public으로 정의되었다는 가정하에) Vector::const_iterator는 템플릿 타입 파라미터인
From, To에 의존하는 dependent name이기 때문에 typename을 붙여야 합니다.
ptr_은 형명이 아니라 Vector::const_iterator형의 멤버 데이터가 되고요.
doldori의 이미지

Anonymous wrote:
typename Vector<RangeMapRange<From,To> >::const_iterator ptr_ ;

에서 ::const_iterator 부분을 빼주니 컴파일이 되다가 아래와 같이 에러가 나옵니다.


통상적인 명명법이나 문맥으로 볼 때 ::const_iterator를 없애면 안될 것 같은데요.
puaxx의 이미지

doldori wrote:
Anonymous wrote:
typename Vector<RangeMapRange<From,To> >::const_iterator ptr_ ;

에서 ::const_iterator 부분을 빼주니 컴파일이 되다가 아래와 같이 에러가 나옵니다.


통상적인 명명법이나 문맥으로 볼 때 ::const_iterator를 없애면 안될 것 같은데요.

그런데 ::const_iterator를 붙이면

../include/RangeMap.h:43: error: expected `;' before "ptr_"

이런 에러가 나면서 컴파일이 진행되지 않구요..빼주면 컴파일은 되더라구요...

puaxx의 이미지

이소스는 SGML파서 소스의 일부입니다..

      1 // Copyright (c) 1994 James Clark
      2 // See the file COPYING for copying permission.
      3
      4 #ifndef RangeMap_INCLUDED
      5 #define RangeMap_INCLUDED 1
      6
      7 #include "Vector.h"
      8 #include "Boolean.h"
      9 #include "ISet.h"
     10 #include "types.h"
     11 #include <stddef.h>
     12
     13 #ifdef SP_NAMESPACE
     14 namespace SP_NAMESPACE {
     15 #endif
     16
     17 template<class From, class To>
     18 struct RangeMapRange {
     19   From fromMin;
     20   From fromMax;
     21   To toMin;
     22 };
     23
     24 template<class From, class To> class RangeMapIter;
     25
     26 template<class From, class To>
     27 class RangeMap {
     28 public:
     29   RangeMap();
     30   Boolean map(From, To &, From &alsoMax) const;
     31   // Return 0 for no matches, 1 for 1, 2 for more than 1.
     32   unsigned inverseMap(To, From &, ISet<WideChar> &, WideChar &count) const;
     33   void addRange(From, From, To);
     34 private:
     35   Vector<RangeMapRange<From,To> > ranges_;
     36   friend class RangeMapIter<From,To>;
     37 };
     38
     39 template<class From, class To>
     40 class RangeMapIter {
     41 private:
     42   size_t count_ ;
     43   //typename Vector<RangeMapRange<From,To> >::const_iterator ptr_ ;
     44   typename Vector<RangeMapRange<From,To> > ptr_;
     45
     46 public:
     47   RangeMapIter(const RangeMap<From,To> &map);
     48   Boolean next(From &fromMin, From &fromMax, To &toMin) {
     49     if (!count_)
     50       return 0;
     51     else {
     52       fromMin = (ptr_)->fromMin;
     53       fromMax = (ptr_)->fromMax;
     54       toMin = (ptr_)->toMin;
     55       (ptr_)++;
     56       count_--;
     57       return 1;
     58     }
     59   }
     60 };
     61
     62 #ifdef SP_NAMESPACE
     63 }
     64 #endif
     65
     66 #endif /* not RangeMap_INCLUDED */
     67
     68 #ifdef SP_DEFINE_TEMPLATES
     69 #include "RangeMap.cxx"
     70 #endif
doldori의 이미지

puaxx wrote:
그런데 ::const_iterator를 붙이면

../include/RangeMap.h:43: error: expected `;' before "ptr_"

이런 에러가 나면서 컴파일이 진행되지 않구요..빼주면 컴파일은 되더라구요...


Vector.h의 내용을 봐야 확실히 알 수 있겠습니다만, 지금 짐작으로는 아래처럼
RangeMapIter::next()를 실제로 호출해 보면 컴파일이 안될지도 모릅니다.
RangeMap<int, int> m;
RangeMapIter<int, int> iter(m);
int ii, jj, kk;
iter.next(ii, jj, kk);
puaxx의 이미지

2.95에서는무리없이 컴파일 되던게 3.x에서는 컴파일이 안되니 황당하네요..쩝..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.