2016-10-13 8 views
0

Ich möchte eine Funktion implementieren, die als MATLAB sort() fungiert. Ich habe eine Struktur und eine Funktionsvorlage in einer Kopfdatei wie unten definiert.Funktionsvorlage als Funktion Argument

template<typename T_val> struct SORT_DATA  
{ 
    T_val value;      // 
    int index; 
}; 

template<typename T_var> 
bool ccmp(SORT_DATA<T_var> & var_a, SORT_DATA<T_var> & var_b) 
{ 
    return var_a.value < var_b.value; 
} 

In main(), verwende ich eine Struktur variabel und passieren die CCMP() als Argument für C++ sort(), wie unten.

//SORT_DATA<double> * data1 = new SORT_DATA<double>[15]; 
SORT_DATA<double> data1[15]; 

double tmp_data[15] = {25, 23, 1, 32, 0, 43, 98, 8, 7, 11, 34, 52, 32, -53, 6}; 

for(int i=0; i<15; i++) 
{ 
    data1[i].value = tmp_data[i]; 
    data1[i].index = i; 
} 

//sort(data1, data1+15, ccmp); 

for(int i=0; i<15; i++) 
    std::cout<<setw(5)<<data1[i].value<<" "; 

std::cout<<std::endl; 

for(int i=0; i<15; i++) 
    std::cout<<setw(5)<<data1[i].index<<" "; 

Ich habe mehrere Probleme: 1. Es scheint, dass der Speicher für die Strukturvariablen zuzuweisen gescheitert war. 2. Ich habe eine Fehlermeldung von VS2010 erhalten, die besagt, dass die Funktionsvorlage nicht als Funktionsargument verwendet werden kann.

#pragma once 

#include <iostream> 
#include <iomanip> 
#include <algorithm> 
#include "customizedalg.h" // This is simply the declaration of the struct and bool cmp(). 


using namespace std; 


int main(int argc, char ** argv) 
{ 

    SORT_DATA<double> * data1 = new SORT_DATA<double>[15]; 
    //SORT_DATA<double> data1[15]; 

    double tmp_data[15] = {25, 23, 1, 32, 0, 43, 98, 8, 7, 11, 34, 52, 32, -53, 6}; 

    for(int i=0; i<15; i++) 
    { 
     data1[i].value = tmp_data[i]; 
     data1[i].index = i; 
    } 

    sort(data1, data1+15, ccmp<double>); 

    for(int i=0; i<15; i++) 
     std::cout<<setw(5)<<data1[i].value<<" "; 

    std::cout<<std::endl; 

    for(int i=0; i<15; i++) 
     std::cout<<setw(5)<<data1[i].index<<" "; 

    std::cout<<std::endl; 

    std::cin.ignore(); 

    return 0; 
} 
+9

'for (int i = 0; i ++; i <15) 'so sollte eine for-Schleife nicht aussehen –

+0

Bitte geben Sie eine [mcve] an. Wenn Sie eine Fehlermeldung über eine bestimmte Zeile im Code haben, markieren Sie diese Zeile eindeutig –

+0

@PiotrSkotnicki Danke Piotr. Es ist lange her, dass ich C++ nicht benutzt habe. Das ist ... MATLAB-Stil. Jetzt kann es Werte ausgeben, aber die zweite benötigt noch Hilfe. – user18441

Antwort

0

Sie sollten angeben Vorlage von ccmp Funktion, als Piotr kommentiert, aber Sie brauchen keine Adresse der Funktion zu übernehmen:

std::sort(data1, data1+15, ccmp<double>);

Here is working sample

Und wenn Ihr Compiler schlägt fehl, templated Funktion zu verwenden, Sie können versuchen, eine Struktur mit überladenem Operator() zu bilden:

template<typename T_var> 
struct ccmp 
{ 
    bool operator()(SORT_DATA<T_var> & var_a, SORT_DATA<T_var> & var_b) const 
    { 
     return var_a.value < var_b.value; 
    } 
}; 
... 
std::sort(data1, data1+15, ccmp<double>()); 

Sample

+0

Danke Evgeniy. Ich habe das versucht aber gescheitert. – user18441

+0

@ user18441, auch mit dem Link in der Antwort? – Evgeniy

+0

Vielen Dank, Evgeniy. Dieser funktioniert gut, aber wie kann ich reparieren, wenn ich das in der Art der Template-Funktion machen möchte. – user18441

Verwandte Themen