[질문] 다음 에러가 뭔 말인지요?
글쓴이: zaru / 작성시간: 토, 2006/11/04 - 3:34오후
안녕하세요. C++ 왕초보 입니다.
Fedora Core 5에
[root@fc5 sword-1.5.3a]# g++ -v Using built-in specs. Target: i386-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux Thread model: posix gcc version 4.1.1 20060525 (Red Hat 4.1.1-1)
로 빌드 하는데 다음과 같은 에러가 납니다.
g++ -DUSE_AUTOTOOLS -DGLOBCONFPATH=\"/usr/local/etc/sword.conf\" -DUNIX -I. -I. -I.. -I../include -g -O2 -ftemplate-depth-25 -c ../src/keys/listkey.cpp -MT listkey.lo -MD -MP -MF .deps/listkey.TPlo >/dev/null 2>&1 mv -f .libs/listkey.lo listkey.lo source='../src/keys/versekey.cpp' object='versekey.lo' libtool=yes \ depfile='.deps/versekey.Plo' tmpdepfile='.deps/versekey.TPlo' \ depmode=gcc3 /bin/sh ../depcomp \ /bin/sh ../libtool --mode=compile g++ -DUSE_AUTOTOOLS -DGLOBCONFPATH=\"/usr/local/etc/sword.conf\" -DUNIX -I. -I. -I.. -I../include -g -O2 -ftemplate-depth-25 -c -o versekey.lo `test -f ../src/keys/versekey.cpp || echo './'`../src/keys/versekey.cpp rm -f .libs/versekey.lo g++ -DUSE_AUTOTOOLS -DGLOBCONFPATH=\"/usr/local/etc/sword.conf\" -DUNIX -I. -I. -I.. -I../include -g -O2 -ftemplate-depth-25 -c ../src/keys/versekey.cpp -MT versekey.lo -MD -MP -MF .deps/versekey.TPlo -fPIC -DPIC ../include/multimapwdef.h: In member function 'T& multimapwithdefault<Key, T, Compare>::operator[](const Key&)': ../include/multimapwdef.h:15: error: there are no arguments to 'end' that depend on a template parameter, so a declaration of 'end' must be available ../include/multimapwdef.h:15: error: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated) make[2]: *** [versekey.lo] 오류 1 make[2]: Leaving directory `/home/p2/apps/sword-1.5.3a/lib' make[1]: *** [all-recursive] 오류 1 make[1]: Leaving directory `/home/p2/apps/sword-1.5.3a' make: *** [all] 오류 2
관련 헤더 파일은
#ifndef MULTIMAPWDEF #define MULTIMAPWDEF #include <map> using namespace std; // multmap that still lets you use [] to reference FIRST // entry of a key if multiples exist template <class Key, class T, class Compare> class multimapwithdefault : public multimap<Key, T, Compare> { public: typedef pair<const Key, T> value_type; T& operator[](const Key& k) { if (find(k) == end()) { insert(value_type(k, T())); } return (*(find(k))).second; } bool has(const Key& k, const T &val) const { typename multimap<Key, T, Compare>::const_iterator start = lower_bound(k); typename multimap<Key, T, Compare>::const_iterator end = upper_bound(k); for (; start!=end; start++) { if (start->second == val) return true; } return false; } }; #endif
입니다. 무슨 에러이고 어떤 조치를 해야 하나요?
어떻게 하면 C++은 단기간에 꽊! 잡을 수 있죠.
감사합니다.
Forums:
error 설명은...
-fpermissive 를 넣으라네요.
이 option 은 비호환 code 에 대한 허용을 추가해주는 것입니다.
즉 어딘가 표준에 호환이 없는 code 를 사용하고 계신 것 같습니다.
솔직히 저는 전혀 이해못하는 compile 과정이네요.
아무리 make 라지만 저렇게 복잡한 compile option 이라니...
그리고 단기간에 C++ 를 꽉 잡는 법 같은 LSD 를 먹어야만 보이는 것은 없습니다... ^_^
C++ 의 복잡함을 즐기시라고 밖에는 해드릴 말이 없네요...
LSD가 뭔지요? ^^;;;
LSD가 뭔지요? ^^;;;
===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다
검색해보세요.
사실 LSD 를 이야기한 것은 동일한 맥락의 의미는 없습니다만 Effective Series 로 유명한 Scott Meyers 가 그의 저서
More Effective C++ 에서 추천도서를 소개하는 도중 James Coplien 의 Advanced C++ 를
LSD 로 비유한것이 떠올라서였습니다.
Scott 은 C++ 로 할 수 없으리라 할 만한 것들이 이 책에서 펼쳐지고 있으며,
이 책을 읽으면 황홀감을 느낀다는 의미에서 그런 표현을 했습니다만...
Advanced C++ 는 이제는 너무 오래된 책이고, 현대적 C++ Style 에는 맞지 않습니다.
C++ 의 발전사와 다른 programming 언어들과의 비교라는 면에서나 그 가치를 찾을 수 있게 되었죠.
(C++ 는 Multi Paradigm Language 이기 때문에 중요한 문제이긴 합니다.)
C++ 를 단기간에 이해한다는 것은 제가 생각하기에는 도저히 해낼 수 없는 문제로 생각되어지기에
그러한 방법이 있다면 정말 황홀경에 빠질 것입니다.
제가 생각하기에는 g++ STL bug 같은데...
음... Visual C++ 에서는 문제없이 compile 되네요.
아마도 g++ 의 STL 에서는 end 가 전역 template 함수로 작성된 것 같습니다.
end() 앞에 this-> 를 넣어주시면 혼돈없이 잘 찾아서 compile 합니다.
진행은 되었는데.. 또 다음과 같은 에러가.. ㅡ.ㅡ;;
Makefile 에
CXXFLAGS = -g -O2 -ftemplate-depth-25 -fpermissive
추가 하고, multimapwdef.h 헤더파일에 다음과 같이 한 줄만 this-> 를 붙혔습니다.
그러니까 빌드를 진행 하다가 또 다음과 같은 에러가.. 나네요..
/usr/local/etc/sword.conf 파일에는 다음과 같은 내용이 들어 있고요,
../src/mgr/swmgr.cpp:638: instantiated from here ==> 에서 swmgr.cpp:638번째 줄은 다음과 같이 되어 있습니다.
section["AbsoluteDataPath"] = datapath;
다시 한번 도움 부탁 드립니다.
감사합니다.
===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다
계속해서 동일한 문제군요.
find(k) 앞에 this-> 를 붙이면 해결될 것으로 보입니다.
사실 end() 에서 문제가 발생했을때는 그나마 이해할 수 있었습니다만 find 까지 문제를 일으키는 것은 도저히 이해할 수가 없군요.
algorithm 의 find 와 혼돈하고 있는 것으로 보이는데 그렇다면 map header 에서 algorithm 을 include 한 후
using namespace std; 로 namespace 를 무력화 시켰다고 밖에는 생각할 수 없습니다.
g++ STL 이 훌륭하게 작성되지 않았다고 밖에는 이해할 수가 없습니다.
음...
어쩌면 swmgr.cpp 에서 multimapwdef.h 를 include 하기 전에 algorithm 을 include 하나요?
아니면 multimapwdef.h 전에 include 되는 header 에 의해 다시 algorithm 이 include 될지도 모르겠군요.
그렇다면 이것은 g++ STL 의 bug 가 아니라 C++ 를 정확히 이해하지 못하신 zaru 씨의 잘못입니다.
만일 using namespace std; 를 없애시고
모든 pair, multimap 앞에 std:: 를 붙여서 해결된다면 그쪽을 추천합니다.
사실 저는 이 문제는 C++ 의 불편함이라고 생각하긴 합니다.
님의 내공에 무한한 감사를... ^^
님의 말씀대로 using namespace std; 를 주석처리하고, end() 앞에만 this->를 붙혔더니 빌드가 되었습니다. 감사합니다.
===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다
내공이라고 말씀하시니 몸둘바를 모르겠군요.
그다지 무협을 즐기지를 않아서 생소한 단어라 뭔가 대단한 칭친을 받은 기분이네요.
하지만 최근에 제 글을 보면 저도 참 뻘 짓 많이 하고, 많이 물어보고, 많이 배운답니다.
C++ 계는 와호장룡도 많고, 그 한계를 감히 짐작할 수 없는 것 같습니다.
댓글 달기