最終的にコンパイルが通ったものが以下になりまして、
#include <iostream>
#include <cstring>
#include <boost/format.hpp>
using namespace std;
using namespace boost;
template <typename Type>
Type minof(Type x[], int n)
{
Type min = x[0];
for(int i = 1; i < n; i++){
if(x[i] < min){
min = x[i];
}
}
return min;
}
template <> const char*
minof<const char*>(const char* x[], int n)
{
int min = 0;
for(int i = 1; i < n; i++){
if(strcmp(x[i], x[min]) < 0){
min = i;
}
}
return x[min];
}
int main(int argc, const char *argv[]){
int ia[] = {5, 9, 12, 3, 6};
const char* sa[] = {"ABC", "ABCD", "D", "BC", "AAAA"};
int iasize = sizeof ia / sizeof ia[0];
int sasize = sizeof sa / sizeof sa[0];
cout << format("%s") % minof(ia, iasize) << endl;
cout << format("%s") % minof<const char*>(sa, sasize) << endl;
}
error: template-id ‘minof<const char*>’ for ‘const char* minof(const char**, int)’ does not match any template declaration
というエラーが出て延々と頭を悩ませていた訳ですが、
上記のconstを外したらコンパイルできたのはいいのですが、これでは明示的に<const char*>(sa, sasize)と呼び出しているのに、意味がない気がします(そう思って(sa, sasize)で呼び出したらこれでも通った・・!でもその場合でもconst Type x[]のconstを外すとやっぱりエラー)。const Type x[]の方のconstをつけたまま呼び分ける事は出来ないという事なんですかね??(何か少し変えればつけたまま呼び分けられますか?)
この辺の仕組みがよく分からないので、どなたか教えて下さい。。