2016-04-26 15 views
0

Ich habe Probleme mit der Verwendung von strcmp() für ein const char * Array innerhalb einer Template-Spezialisierung.C++ ungültige Konvertierung von 'char' zu 'const char *' in strcmp() innerhalb einer Template-Spezialisierung

In meinem Skript möchte ich mehrere Arrays von großen Werten/Länge zu kleineren sortieren. Es funktioniert für ein Integer- und Float-Array, funktioniert jedoch nicht für ein const char * -Array. Ich habe 3 Template-Funktionen mit ihrer Definition deklariert. Für das Array const char * verwende ich eine spezialisierte Template-Funktion, die die Funktion strcmp (const char *, const char *) benutzt, um das Array zu sortieren.

Mein Skript ist wie folgt (zunächst die Vorlage Erklärungen, die zweite das Hauptskript, dritte die Template-Funktionsdefinitionen):

#include <iostream> 
#include <string.h> 

using namespace std ; 

// Template function declarations 
template <class T> 
void order(T& a, T& b) ; 

template <class T> 
void sort(T* c, int d) ; 

template <class T> 
void display(T* e, int f) ; 

// Main 
int main() { 

int random[10] = {10,23,5,37,56,0,20,88,95,32} ; // Random Array of integers 

float random_fl[10] = {9.5,66.2,5.8,41.1,89.4,0.6,23.4,66.5,90.9,57.7} ; // Random Array of floats 

const char* random_char[] = {"blah", "blahblah", "string", "character", "literal", "one", "randomize", "unsigned", "red", "wolf"} ; 

int length = sizeof(random)/sizeof(int) ;   // Calculating the lenght of the array 
int length_fl = sizeof(random_fl)/sizeof(float) ; 
int length_char = sizeof(random_char)/sizeof(const char*) ; 

cout << "Initial integer Array: ";       // Terminal message giving the initial array 
for (int i = 0; i < length; ++i) { 
    cout << random[i] << " "; 
} 
cout << endl; 

cout << "Initial float Array: ";        
for (int i = 0; i < length_fl; ++i) { 
    cout << random_fl[i] << " "; 
} 
cout << endl; 

cout << "Initial character Array: ";        
for (int i = 0; i < length_char; ++i) { 
    cout << random_char[i] << " "; 
} 
cout << endl; 


sort(random, length) ;        // Call sort() function to sort array 
sort(random_fl, length_fl) ;       
sort(random_char, length_char) ; 

display(random, length) ;       // Call display() function to print sorted array in terminal 
display(random_fl, length_fl) ; 
//display(random_char, length_char) ; 

return 0 ; 
} 

// Template function definitions 
template <class T> 
void order(T& a, T& b) {        // order function using references 
T Temp = a ; 
a = b ; 
b = Temp ; 
} 

template <class T> 
void sort(T* c, int d) {       // Sorting function 

    for (int i=0; i<d-1; i++) { 

     for (int j=0; j<d-1-i; j++) { 

      if(c[j+1] > c[j]) { 
       order(c[j] , c[j+1]) ;  
      } 
     } 
     } 
} 

template<>           
void sort(const char* a, int b) {   // Template specialization sort function for character string 

    for (int i=0; i<b-1; i++) { 

     for (int j=0; j<b-1-i; j++) { 

      if(strcmp(a[j+1], a[j])>0) { 
        order(a[j], a[j+1]) ; 
      } 

     } 
    } 
} 

template <class T> 
void display(T* e, int f) {       // Display function 
    cout << "Sorted Array: "; 
    for (int i=0; i<f; i++) { 
     cout << e[i] << " "; 
    } 
    cout << endl ; 
} 

Wenn das Skript kompilieren, erhalte ich die Fehlermeldung, dass eine ungültige Umwandlung auftritt von 'char' nach 'const char *' in der Funktion strcmp (const char *, const char *) innerhalb meiner spezialisierten Template-Funktion. Ich frage mich warum, da ich ein const char * -Array mit 10 String-Literalen definiert habe. Die Array-Elemente a [j + 1] und a [j] sollten also auch const char * -Elemente sein, da sie zu Beginn der spezialisierten Sortierfunktion mit der Definition von const char * a erwartet werden.

Ich bin ziemlich neu in C++ und habe vor allem Schwierigkeiten beim Verstehen von Zeigern und wie man sich auf Array-Elemente mit Zeigern/Referenzen bezieht, was meiner Meinung nach die Wurzel dieses Problems ist.

Bitte beachten Sie mein Englisch und danke im Voraus.

Edit:

Auch wenn meine if() Anweisung eine sortierte Zeichenfolge erhalten noch nicht korrekt ist, wie Steiner wies darauf hin, die strcmp() arbeitet nun wie vorgesehen.

Ich danke Ihnen allen freundlich für Ihre Hilfe.

+2

Wenn 'a'' const char * 'ist,' a [j + 1] 'ist' char'. Was hast du erwartet? Oh, und es gibt eine Klammer, die um '0 'Vergleich fehlt. – Arkadiy

+3

Nur noch ein Grund, C-Strings zu verwerfen und 'std :: string's zu verwenden. Dann könntest du auch 'std :: sort' verwenden. – NathanOliver

+0

@Arkadiy, ja, tut mir leid. Ich sehe, ich habe die Klammer versehentlich gelöscht. –

Antwort

2

Wie teilweise durch @Arkadiy erwähnt, Sie sind in der Spezialisierung der Art für die const char * und die, wenn die Bedingung ein Stern fehlt, ist nicht korrekt:

template<>           
void sort(const char** a, int b) {   
    for (int i=0; i<b-1; i++) { 
     for (int j=0; j<b-1-i; j++) { 
      if(strcmp(a[j+1], a[j]) > 0) { 
        order(a[j], a[j+1]) ; 
      } 
     } 
    } 

Und diese Spezialisierung anders erscheinen müssen, bevor der Haupt Sie erhalten einen Compilerfehler vom Typ: Spezialisierung nach Instanziierung (siehe this question).

Wenn Sie dies die richtige Ausgabe erhalten ändern:

Initial chararacter Array: blah blahblah string character literal one randomize unsigned red wolf 
Sorted Array: wolf unsigned string red randomize one literal character blahblah blah 
0

Der Compiler wird sich beschweren, wenn Sie eine const Variable an eine Funktion übergeben, die ein non-const Argument verwendet. Ein Element eines const char* ist ein const char, und das ist nicht kompatibel mit Ihrer Funktion order(T&, T&).

Darüber hinaus gibt es ein paar andere Probleme mit Ihrem Programm, wie die Klammern strcmp() und die Verwendung von strcmp() mit einzelnen Zeichen überhaupt.

+0

Was? Die Reihenfolge ist so festgelegt, dass die Parameter übereinstimmen, damit sie kompiliert werden können. Der Fehler des OP ist mit 'strcmp' und von [Arkadiys Kommentar] (http://stackoverflow.com/questions/36864817/c-invalid-conversion-from-char-to-const-char-in-strcmp-within-a) -templat # comment61296778_36864817) Sie können sehen, warum – NathanOliver

+0

order() seinen Referenzargumenten zuweist, damit die Vorlage nicht für const-Variablen aufgelöst werden kann. Trotzdem bin ich bei @steiner nun der Meinung, dass das OP eine Reihe von C-Strings sortieren soll. – Stefan

0

meine Antwort war ein Unsinn, steiner Antwort ist richtig, soll Ihre Art Vorlage sein:

template<>           
void sort(const char** a, int b) { 

und oben befindet ihr Punkt der Instantiierung (düber main())

Verwandte Themen