C++ Template mit Container

Fonce

Captain
Registriert
Feb. 2006
Beiträge
3.436
Hi,
ich möchte grade eine Template Methode schreiben welche einen zwei Container als Parameter hat welcher aber nur std::string enthalten dürfen, habe aber Probleme mit der Definition.

Wo genau liegt hier der Fehler?
Code:
template<typename Container>
void attach_files(const std::string& top_file, const Container<std::string>& files_to_attach, const Container<std::string>& original_files, const std::string& output_name)
{
//Code...
}

Ohne Angabe von std::string funktioniert es, aber das ganze soll eben nur mit std::string funktionieren.
Ergänzung ()

ok, schon selber gefunden^^

muss wie folgt aussehen
Code:
template<template <typename> typename Container>
void attach_files(const std::string& top_file, const Container<std::string> &files_to_attach, const Container<std::string> &original_files, const std::string& output_name)
 
Das sollte doch eigentlich mit den Standardcontainern nicht funktionieren: Die haben ja alle mindestens noch einen zweiten template Parameter (z.B. den allocator)
 
Ah, danke für den Hinweis.
War noch nicht dazu gekommen das Template dann auch im Einsatz zu testen, weshalb mir das noch nicht aufgefallen war.

Hier die Lauffähige Version
Code:
template<template <typename, typename> typename Container>
void attach_files(const std::string& top_file, 
	const Container<std::string, std::allocator<std::string>> &files_to_attach, 
	const Container<std::string, std::allocator<std::string>> &original_files, 
	const std::string& output_name)
 
Hier noch ein kleiner Erweiterungsvorschlag, damit es - falls nötig - auch mit anderen Allokatoren und Kontainern funktioniert:
Code:
template<template <class, class ...> class Container,  class ... CARGS>
void attach_files(const std::string& top_file,
	const Container<std::string, CARGS...> &files_to_attach,
	const Container<std::string, CARGS...> &original_files,
	const std::string& output_name) 
{

}
 
Gibt es den Container welche abgesehen vom Typ und allocater weitere Parameter aufnehmen? Dein Template würde nämlich genau das zulassen.

Damit ein Container beliebigen Typs mit von std::allocator abweichendem Allacator aufgenommen wird müsste das ganze doch eher so aussehen.

Code:
template<template <typename, typename> class Container, typename T, typename Alloc_Type = std::allocator<T>>
void attach_files(const std::string& top_file,
	const Container<T, Alloc_Type> &files_to_attach,
	const Container<T, Alloc_Type> &original_files,
	const std::string& output_name)
{

}
 
Äh, jetzt lässt du wieder alle Datentypen zu, nicht nur std::string.
Davon abgesehen, wenn du nur mit STL Containern arbeitest, dann reicht das (ich nehme mal nicht an, dass du mit set, map und co arbeitest). Eigene Container oder Container aus anderen Bibliotheken (z.B. QList) haben halt evtl. mehr oder weniger Parameter, daher der Rundumschlag.
 
Aso ok, jetzt versteh ich worauf die hinauswolltest. :D
Ja, ich arbeite nur mit den STL Containern.
Ich brauchte das Template(Die Methode ist eine Neuimplementierung einer bestehenden), da aktuell an vielen Stellen noch std::list statt std::vector verwendet wird(Altes Projekt welches ich übernommen habe und dessen ehemaligen Entwickler so ziemlich alles was man nicht machen sollte, gemacht haben :freak: ). Da ich für die Umstellung auf std::vector erst später Zeit habe, eben das Template welches mir eine Schrittweise Umstellung erlaubt.
 
Zurück
Oben