C++ 関数テンプレートの特殊化で分からない事があります。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kattun

C++ 関数テンプレートの特殊化で分からない事があります。

#1

投稿記事 by kattun » 10年前

新版明解 C++ 入門編の演習9−5(答え無し)を解く仮定でわからないことが発生しました。
最終的にコンパイルが通ったものが以下になりまして、

コード:

#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;
}
この前は、Type minof(Type x[], int n)の所が、Type minof(const Type x[], int n)になっていて、
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をつけたまま呼び分ける事は出来ないという事なんですかね??(何か少し変えればつけたまま呼び分けられますか?)

この辺の仕組みがよく分からないので、どなたか教えて下さい。。

kattun

Re: C++ 関数テンプレートの特殊化で分からない事があります。

#2

投稿記事 by kattun » 10年前

誤植訂正です。

〜その場合でもconst Type x[]のconstを外すとやっぱりエラー(誤
〜その場合でもconst Type x[]のconstをつけるとやっぱりエラー(正

hoge

Re: C++ 関数テンプレートの特殊化で分からない事があります。

#3

投稿記事 by hoge » 10年前

constが足りない

コード:

template <> const char*
  minof<const char*>(const char* const x[], int n)

kattun

Re: C++ 関数テンプレートの特殊化で分からない事があります。

#4

投稿記事 by kattun » 10年前

返信有難うございます。
なるほど、それでもコンパイルできるのですね。

しかしそうなりますと、数値版minofとの差別化の為にそこにconstをつけて、文字列版のminofの方でxのポインタを変えたい関数を作れなくなる訳ですか。(今回の例題では全くそのような必要はないですが・・)
それをしない場合は、私の先ほどのソースのように、数値版のconstをはずさなくてはならないと。

つまりこの場合、明示的な特殊化で関数を同じ名前に出来ても、不要なconstをつけるか、必要なconstを外すかして差別化を図らないと実装が出来ない・・C++はそういう仕様という事ですかね?

hoge

Re: C++ 関数テンプレートの特殊化で分からない事があります。

#5

投稿記事 by hoge » 10年前

不要なconstってどれのこと?

template <typename Type>
Type minof(const Type x[], int n)

Type=const char*で特殊化

template <> const char*
minof<const char*>(const char* const x[], int n)

const Type x[]をType=const char*で特殊化するのでconst が2回出てくるのが自然と思うけど。
赤色がType部分で黄色が特殊化していない方にもあるconstです。

kattun

Re: C++ 関数テンプレートの特殊化で分からない事があります。

#6

投稿記事 by kattun » 10年前

なるほど、そう考えれば自然ですか。
*とかconst祭りになるとなかなかややこしく感じますね!

まだまだですが、理解を深めることが出来ました。

有難う御座いました。

閉鎖

“C言語何でも質問掲示板” へ戻る