Funktionstemplate mit vector

Krikus

Mitglied
Hi,

ich habe da ein kleines Problem mit einem selbstgeschriebenen Funktionstemplate.
Der Compiler spuckt folgende Fehlermeldung aus:

Code:
error C2440: 'Initialisierung': 'int' kann nicht in 'std::vector<_Ty>' konvertiert werden

Hier der entsprechende Code:

PHP:
......
template <typename T>
void menue4(T &A, int n) {
    for (int i=1; i < n; i++) { // Durchläufe
        for (int j=n-1; j>=i; j--) { // ein Durchlauf
            if (A[j-1] > A[j]) { // vertauschen
                T tmp = A[j-1]; //FEHLERMELDUNG
                A[j-1] = A[j];
                A[j] = tmp;
            }
        }
    }........

int _tmain(int argc, _TCHAR* argv[])
{
	int auswahl;
	const int anzahl=10000;
	vector <int> A(anzahl);

menue4(A, anzahl);
 
	return 0;
}
}

vllt. kann mir einer helfen den Fehler zu beheben.
 
Hi.

Das Problem ist eigentlich offensichtlich wenn man manuell das Template instanziert. Dann liest sich die Zeile mit dem Fehler wie folgt:
C++:
vector<int> tmp = A[j-1]; //FEHLERMELDUNG
Du könntest es so machen:
C++:
typename T::value_type tmp = A[j-1];
Oder nimm einfach std::swap:
C++:
#include <algorithm>

std::swap(A[j], A[j-1]);
Gruß
 
Vielen Dank für deine gute Antwort.

Beim BubbelSort habe ich nun swap genommen.
Bei 2 weiteren Sortierverfahren müsste ich

PHP:
typename T::value_type tmp

nehmen.

Könntest du evt. diesen Ausdruck etwas näher erläutern?
 
PHP:
typename T::value_type tmp

nehmen.

Könntest du evt. diesen Ausdruck etwas näher erläutern?
Jede Kontainerklasse der STL besitzt einen öffentlichen Typ(-alias) namens value_type.
C++:
std::vector<int> v;

std::vector::value_type t = 5;

v[i] = t;
Innerhalb des Funktionstemplates kannst du aber nicht einfach auf T::value_type zugreifen, da der Compiler vor Instanziierung des Templates nicht weiß welcher Typ hinter dem Templateparameter T steht und auch nicht weiß ob es sich bei value_type um einen Typ oder einfach um ein Attribut der Klasse handelt. Der Compiler geht immer von einem Attribut bzw. einer Methode aus, so das man in dem Fall das Schlüsselwort typename verwenden muss.

Gruß
 
Habe noch ein kleines Problem bei meinem Funktionstemplate.

Wenn ich nun das Template mit einem char string aufrufe:

PHP:
string stringDaten[] = {"Hund", "Maus", "Esel", "Katze"};
menue4(stringDaten, 4);

dann meckert der Compiler,

Code:
&" konnte nicht von "std::string" hergeleitet werden.

Gibts eine Möglichkeit das Template so abzuändern, dass strigns auch erlaubt sind?
 
Das Problem ist, dass ein normaler Array kein value_type definiert hat. Kannst entweder spezialisieren oder gehst einfach hin und arbeitest mit iteratoren ... dann hasse das problem nicht weil du einfach im template schon den iterator-type übergibst ;)
 
PHP:
template <typename T>
void menue4(T &A, int n)
{
	system("cls");
	time_t vorher=time(NULL); 
	//Sortieren mit Bubble Sort
    for (int i=1; i < n; i++) { 
        for (int j=n-1; j>=i; j--) { 
            if (A[j-1] > A[j]) {  // FEHLERMELDUNG
				swap(A[j], A[j-1]);
             /*typename T::value_type tmp = A[j-1];
                A[j-1] = A[j];
                A[j] = tmp;*/
            }
        }
    }
	time_t nachher=time(NULL); 
	cout << "Werte mit BubbelSort sortiert";
	cout << "Dauer: " << nachher-vorher << "sec" << endl;
	getch();
}
 
Zurück