Template Fehler Filter

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
schorsch_76
Beiträge: 2612
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Template Fehler Filter

Beitrag von schorsch_76 » 18.11.2009 17:48:57

Hallo Leute,

heut bin ich auf was gestossen, das das arbeiten mit templates und gcc wirklich vereinfacht.

Beispielcode;

Code: Alles auswählen

#include <iostream>
#include <string>
#include <list>

int main (int argc, char** argv)
{
	std::list< std::string > l;
	int t = 1;

	l.push_back(&t);
}
ist klar was hier faul ist, aber der gcc gibt folgende Meldung aus:

Code: Alles auswählen

 gcc filter.cpp 
filter.cpp: In function ‘int main(int, char**)’:
filter.cpp:10: error: no matching function for call to ‘std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::push_back(int*)’
/usr/include/c++/4.3/bits/stl_list.h:875: note: candidates are: void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]
Nicht sehr vielsagend. Da muss man ganz schön konzentriert rangehen um hier des Pudels Kern zu sehen.

Mit diesem kleinen Perlscript

Code: Alles auswählen

#!/usr/bin/perl -w

use strict;
use warnings;

while (<>)
{
    s/std::basic_string<char, std::char_traits<char>, std::allocator<char> >\s*/std::string/g;
    s/std::set<(.+?), std::less<\1>, std::allocator<\1> >/std::set<$1>/g;
    s/std::list<(.+?), std::less<\1>, std::allocator<\1> >/std::list<$1>/g;
    s/std::vector<(.+?), std::less<\1>, std::allocator<\1> >/std::vector<$1>/g;
    print;
}
kommt dann eine deutlich vielsagendere ausgabe raus:

Code: Alles auswählen

gcc filter.cpp 2>&1 | ./g++filter.pl 
filter.cpp: In function ‘int main(int, char**)’:
filter.cpp:10: error: no matching function for call to ‘std::list<std::string, std::allocator<std::string> >::push_back(int*)’
/usr/include/c++/4.3/bits/stl_list.h:875: note: candidates are: void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::string, _Alloc = std::allocator<std::string>]
Gefunden hab ich das bei [1]

Viel Spass damit :D

Gruß

schorsch

[1] http://www.enricozini.org/2007/tips/g++-parse/

Milbret
Beiträge: 827
Registriert: 26.05.2008 12:04:54
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Nörten-Hardenberg
Kontaktdaten:

Re: Template Fehler Filter

Beitrag von Milbret » 19.11.2009 06:49:49

Ich scheine das nicht ganz zu verstehen.
Der Fehler ist klar, er wird dir auch schon recht deutlich in der ersten Meldung von g++ geschrieben.

Code: Alles auswählen

/usr/include/c++/4.3/bits/stl_list.h:875: note: candidates are: void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]
Du willst ja einen int in eine string Liste packen, was schon vom logischen her nicht passen kann.
g++ und auch andere Compiler würden dir den Fehler so schreiben, da er dir nur sagen kann, wo das Kernproblem ist.
Und sowohl das Kernproblem wie auch das Problem beim push_back wurden dir eigentlich gesagt.
Aber ich würde mich freuen, wenn du mich etwas aufklärst :)

Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

Benutzeravatar
schorsch_76
Beiträge: 2612
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Template Fehler Filter

Beitrag von schorsch_76 » 19.11.2009 07:50:20

Letztes hab ich ein Programm gemacht, das einen string mit einem allocator für shared memory nutzt. Dieser ShmemString wurde dann in einen ShmemList gepackt. ShmemList hat natürlich auch nochmal nen eigenen Allocator. Der Allocator hatte auch nochmal einen template Argument. Den Segmentmanager. (boost::interprocess). Du kannst dir vorstellen, wenn es hier ein Problem gibt, sind die Fehlermeldungen extrem unübersichtlich, da du Datentypennamen hast die über mehrere Zeilen gehen. Hier war dieses script extrem nützlich ;) Natürlich hab ich dann in dem Script eben die Datentypen mit ShmemList<x> erweitert.

Das Problem ist wenn du einfach nen ganze Seite mit Fehlermeldungen hast, du einfach denn überblich verlierst. MSVC2005/2008 zeigt die einzelnen Templateparameter in eignen Zeilen an, was der Übersichtlichkeit einfach nützlich ist.

Gruß

schorsch

Antworten