Seite 1 von 1

GCC, ich liebe dich.

Verfasst: So Jul 24, 2011 5:52 pm
von fat-lobyte

Code: Alles auswählen

In file included from /home/alexander/nuke-ms/test/common/test_segmentationlayer.cpp:4:0:
/home/alexander/nuke-ms/include/msglayer.hpp: In member function 'ByteOutputIterator nuke_ms::SerializedData::fillSerialized(ByteOutputIterator) const [with ByteOutputIterator = __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >]':
/home/alexander/nuke-ms/include/msglayer.hpp:477:42:   instantiated from 'ByteOutputIterator nuke_ms::SegmentationLayer<InnerLayer>::fillSerialized(ByteOutputIterator) const [with ByteOutputIterator = __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >, InnerLayer = nuke_ms::SerializedData]'
/home/alexander/nuke-ms/test/common/test_segmentationlayer.cpp:32:29:   instantiated from here
/home/alexander/nuke-ms/include/msglayer.hpp:325:75: error: invalid use of void expression
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_algobase.h:67:0,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/char_traits.h:41,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/ios:41,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/ostream:40,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/iostream:40,
                 from /home/alexander/nuke-ms/test/common/test_segmentationlayer.cpp:1:
/usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_iterator_base_funcs.h: In function 'void std::__advance(_RandomAccessIterator&, _Distance, std::random_access_iterator_tag) [with _RandomAccessIterator = const __gnu_cxx::__normal_iterator<const unsigned char*, std::vector<unsigned char> >, _Distance = long int]':
/usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_iterator_base_funcs.h:175:7:   instantiated from 'void std::advance(_InputIterator&, _Distance) [with _InputIterator = const __gnu_cxx::__normal_iterator<const unsigned char*, std::vector<unsigned char> >, _Distance = long unsigned int]'
/home/alexander/nuke-ms/include/msglayer.hpp:325:75:   instantiated from 'ByteOutputIterator nuke_ms::SerializedData::fillSerialized(ByteOutputIterator) const [with ByteOutputIterator = __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >]'
/home/alexander/nuke-ms/include/msglayer.hpp:477:42:   instantiated from 'ByteOutputIterator nuke_ms::SegmentationLayer<InnerLayer>::fillSerialized(ByteOutputIterator) const [with ByteOutputIterator = __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >, InnerLayer = nuke_ms::SerializedData]'
/home/alexander/nuke-ms/test/common/test_segmentationlayer.cpp:32:29:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_iterator_base_funcs.h:154:7: error: passing 'const __gnu_cxx::__normal_iterator<const unsigned char*, std::vector<unsigned char> >' as 'this' argument of '__gnu_cxx::__normal_iterator<_Iterator, _Container>& __gnu_cxx::__normal_iterator<_Iterator, _Container>::operator+=(const difference_type&) [with _Iterator = const unsigned char*, _Container = std::vector<unsigned char>, __gnu_cxx::__normal_iterator<_Iterator, _Container> = __gnu_cxx::__normal_iterator<const unsigned char*, std::vector<unsigned char> >, __gnu_cxx::__normal_iterator<_Iterator, _Container>::difference_type = long int]' discards qualifiers [-fpermissive]
make[3]: *** [test/common/CMakeFiles/test_segmentationlayer.dir/test_segmentationlayer.cpp.o] Error 1
make[2]: *** [test/common/CMakeFiles/test_segmentationlayer.dir/all] Error 2
make[1]: *** [test/CMakeFiles/testsuite.dir/rule] Error 2
make: *** [testsuite] Error 2

:cry:

Re: GCC, ich liebe dich.

Verfasst: So Jul 24, 2011 6:02 pm
von fat-lobyte
Ok.

std::advance() auf einen konstanten iterator anzuwenden ist nicht sehr Klug. Trotzdem finde ich, ist die Fehlermeldung etwas heftig ausgefallen :-/

Re: GCC, ich liebe dich.

Verfasst: So Jul 24, 2011 6:10 pm
von cloidnerux
Wo wäre sonst der spaß :D ?
Aber es ist schon heftig, sowas hab ich selbst noch nicht erlebt.

Re: GCC, ich liebe dich.

Verfasst: So Jul 24, 2011 7:17 pm
von Kerli
Es ist doch schön aufgelistet wie und woher die Instantiierung genau erfolgt ist ;) Wenn du das in einer IDE machst dann wird dir vermutlich einfach die Stelle markiert an der das aufgetreten ist und du siehst sofort was nicht passt.

Bei Templates hat man irgendwie oft das Problem das man leicht von den Fehlermeldungen erschlagen wird; Einfach weil die Typnamen oft sehr lange werden. Normalerweise reicht es aber einfach den Typteil weglassen und hat eine klare Fehlermeldung.

Re: GCC, ich liebe dich.

Verfasst: Mo Jul 25, 2011 8:45 am
von Xin
Gute Fehlermeldungen zu generieren ist gar nicht so einfach.
Die Fehlermeldungen des GCC finde ich aber aussagekräftiger als die von Visual C++.
Beide gehen unterschiedliche Wege: VS versucht die Information für die Fehlerliste in eine Zeile reinzupressen und hat bei Templates in der Compilerausgabe ein paar Zusatzinformationen, der GCC gibt ausführlich Auskunft, wo das Problem ist.

Beim VS sitze ich oft da und verstehe die Fehlermeldung nicht, weil mir Informationen fehlen, beim GCC sitze ich gelegentlich da und suche die Fehlermeldung in einer Unmenge an Informationen und gerade so ein kleines "const" kann in seitenlangen Meldungen mal verloren gehen. Das Problem sitzt vor dem Bildschirm, dass nach zwei Zeilen aufhört zu lesen und die Information zu suchen, in dem es diagonal über den Text springt.
Ich muss mich dann auch zwingen, wirklich zu lesen.

Von daher: GCC, ich liebe Dich passt schon, Visual Studio 10 hat mich was so ein fehlendes const angeht jedenfalls schon sehr im Regen stehen lassen: "Funktion existiert nicht". Aber ich sehe sie ja. Datei nicht eingebunden?

Kein template<...>::bla() const nicht gefunden, "candidate is template<...>::bla()"