1. ホーム
  2. c++

[解決済み] C++関数テンプレートの部分特化?

2022-12-13 02:11:31

質問

以下のコードがクラスの部分的な特殊化であることは知っています。

template <typename T1, typename T2> 
class MyClass { 
  … 
}; 


// partial specialization: both template parameters have same type 
template <typename T> 
class MyClass<T,T> { 
  … 
}; 

また、C++は関数テンプレートの部分的な特殊化を許可していないことも知っています(完全なものだけが許可されます)。しかし、私のコードは、1つまたは同じ型の引数に対して私の関数テンプレートを部分的に特化したことを意味するのでしょうか?なぜなら、Microsoft Visual Studio 2010 Express で動作しているからです! もしそうでなければ、部分的な特殊化の概念について説明していただけませんか?

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

template <typename T1, typename T2> 
inline T1 max (T1 const& a, T2 const& b) 
{ 
    return a < b ? b : a; 
} 

template <typename T> 
inline T const& max (T const& a, T const& b)
{
    return 10;
}


int main ()
{
    cout << max(4,4.2) << endl;
    cout << max(5,5) << endl;
    int z;
    cin>>z;
}

どのように解決するのですか?

関数の部分的な特殊化は、標準ではまだ許可されていません。この例では、実際に をオーバーロードしており、特殊化していません。 max<T1,T2> 関数を使用します。

その 構文 は、次のように表示されるはずです。 多少 のように見えるはずです。

// Partial specialization is not allowed by the spec, though!
template <typename T> 
inline T const& max<T,T> (T const& a, T const& b)
{                  ^^^^^ <--- [supposed] specializing here
  return 10;
}

関数テンプレートの場合 フル 特殊化 は C++ 標準で許されています -- コンパイラの拡張を除いて!