[질문] 다음 에러가 뭔 말인지요?

zaru의 이미지

안녕하세요. 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 &lt;map&gt;
 
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++은 단기간에 꽊! 잡을 수 있죠.

감사합니다.

winner의 이미지

-fpermissive 를 넣으라네요.
이 option 은 비호환 code 에 대한 허용을 추가해주는 것입니다.

즉 어딘가 표준에 호환이 없는 code 를 사용하고 계신 것 같습니다.

솔직히 저는 전혀 이해못하는 compile 과정이네요.
아무리 make 라지만 저렇게 복잡한 compile option 이라니...

그리고 단기간에 C++ 를 꽉 잡는 법 같은 LSD 를 먹어야만 보이는 것은 없습니다... ^_^
C++ 의 복잡함을 즐기시라고 밖에는 해드릴 말이 없네요...

zaru의 이미지

LSD가 뭔지요? ^^;;;

===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다

winner의 이미지

사실 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++ 를 단기간에 이해한다는 것은 제가 생각하기에는 도저히 해낼 수 없는 문제로 생각되어지기에
그러한 방법이 있다면 정말 황홀경에 빠질 것입니다.

winner의 이미지

음... Visual C++ 에서는 문제없이 compile 되네요.

아마도 g++ 의 STL 에서는 end 가 전역 template 함수로 작성된 것 같습니다.
end() 앞에 this-> 를 넣어주시면 혼돈없이 잘 찾아서 compile 합니다.

zaru의 이미지

Makefile 에
CXXFLAGS = -g -O2 -ftemplate-depth-25 -fpermissive
추가 하고, multimapwdef.h 헤더파일에 다음과 같이 한 줄만 this-> 를 붙혔습니다.

#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) == this->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

그러니까 빌드를 진행 하다가 또 다음과 같은 에러가.. 나네요..

g++ -DUSE_AUTOTOOLS -DGLOBCONFPATH=\"/usr/local/etc/sword.conf\" -DUNIX -I. -I. -I.. -I../include -g -O2 -ftemplate-depth-25 -c ../src/mgr/swmgr.cpp -MT swmgr.lo -MD -MP -MF .deps/swmgr.TPlo  -fPIC -DPIC
../include/multimapwdef.h: In member function 'T& multimapwithdefault<Key, T, Compare>::operator[](const Key&) [with Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]':
../src/mgr/swmgr.cpp:638:   instantiated from here
../include/multimapwdef.h:15: error: no matching function for call to 'find(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
../src/mgr/swmgr.cpp:638:   instantiated from here
../include/multimapwdef.h:18: error: no matching function for call to 'find(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
make[2]: *** [swmgr.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

/usr/local/etc/sword.conf 파일에는 다음과 같은 내용이 들어 있고요,

[Install]
DataPath=/usr/local/share/sword/

../src/mgr/swmgr.cpp:638: instantiated from here ==> 에서 swmgr.cpp:638번째 줄은 다음과 같이 되어 있습니다.
section["AbsoluteDataPath"] = datapath;

다시 한번 도움 부탁 드립니다.

감사합니다.

===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다

winner의 이미지

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++ 의 불편함이라고 생각하긴 합니다.

zaru의 이미지

님의 말씀대로 using namespace std; 를 주석처리하고, end() 앞에만 this->를 붙혔더니 빌드가 되었습니다. 감사합니다.

//using namespace std;
...
        if (find(k) == this->end()) {
...

===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다

winner의 이미지

그다지 무협을 즐기지를 않아서 생소한 단어라 뭔가 대단한 칭친을 받은 기분이네요.
하지만 최근에 제 글을 보면 저도 참 뻘 짓 많이 하고, 많이 물어보고, 많이 배운답니다.
C++ 계는 와호장룡도 많고, 그 한계를 감히 짐작할 수 없는 것 같습니다.

댓글 달기

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