2016-10-13 7 views
0

MATLAB sort()として機能する関数を実装したいと思います。 以下のように、構造体と関数テンプレートをheadファイルに定義しました。関数の引数としての関数テンプレート

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; 
} 

main()では、構造変数を使用して、ccmp()をC++ sort()の引数として渡します。

//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<<" "; 

は、私はいくつかの問題を得た: 1.メモリが構造体変数に割り当てることができなかったようです。 2.機能テンプレートを関数の引数として使用できないというVS2010からのエラーメッセージが表示されました。

#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

'。私は+ +; i <15) 'forループはどのように見えるのでしょうか –

+0

[mcve]を入力してください。コード内の特定の行に関するエラーメッセージが表示された場合は、その行を明確にマークしてください。 –

+0

@PiotrSkotnicki Piotrありがとうございます。 C++を使わなかったのはずっと前からのことです。それは... MATLABスタイルです。今、それは値を出力することができますが、2番目の値はまだ助けを必要とします。 – user18441

答えて

0

ピョートルはコメントとしてあなたはccmp機能のテンプレートを指定する必要がありますが、関数のアドレスを取る必要はありません。

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

Here is working sample

そして、あなたのコンパイラの場合テンプレート関数を使用できない場合は、オーバーロードされたoperator()を使用して構造体を作成してみてください。

(iは0 = int型用
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

ありがとうEvgeniy。私はこれを試したが失敗した。 – user18441

+0

@ user18441、回答のリンクがあっても? – Evgeniy

+0

ありがとう、Evgeniy。これはうまくいくが、私がテンプレート機能の方法でそれをやりたいのであれば、どうすれば修正できるのか? – user18441

関連する問題