OS:Windows7
開発用アプリ:VisualStudio2010 VC++
上記の環境にてちまちまとプログラムを組んでいまして、
今回返り値と引数の型だけが違う処理関数をテンプレートでまとめてみようとしましたが
理解が全くないまま使おうとしたのが災いし、エラーでコンパイルが通りませんでした。
以下、単純化したソースとエラー文です。
#include <string>
#include <vector>
struct Sa {
int no;
std::string str;
};
typedef std::vector<Sa> SaArray;
struct Sb {
int no;
int sub_no;
std::string str;
};
typedef std::vector<Sb> SbArray;
template <typename S_Ret, typename SArray_Arg>
S_Ret* GetOne(int request_no, SArray_Arg& array) {
for(int i = 0;i < array.size();i++) {
if(array[i].no == request_no) {
return array[i];
}
}
return NULL;
}
//------------------------------------------------
int main(int argc, char** argv) {
SaArray sa_array;
Sa* a = GetOne(0, sa_array);
SbArray sb_array;
Sb* b = GetOne(0, sb_array);
return 0;
}
error C2783: 'S_Ret *GetOne(int,SArray_Arg &)' : テンプレート 引数を 'S_Ret' に対して減少できませんでした
どういった理由でコンパイルが通らないのか、
正しくはどう記述するべきかもわからないです。
Sa* Sa_GetOne(int request_no, SaArray& array) {
for(int i = 0;i < array.size();i++) {
if(array[i].no == request_no) {
return &array[i];
}
}
return NULL;
}
Sb* Sb_GetOne(int request_no, SbArray& array) {
for(int i = 0;i < array.size();i++) {
if(array[i].no == request_no) {
return &array[i];
}
}
return NULL;
}
テンプレートを使ってみたいというささやかな希望を叶えるためには
どのようにすればよいでしょうか。