C++ 2011 の場合ごとに、クラスメンバー関数のデフォルトのテンプレートパラメーターをどこで指定する必要がありますか (宣言は (もちろん) 「クラス本体」にあり、関数定義はクラス本体の外にあると仮定します) :
- 「通常の」機能
- 静的関数
- フレンド機能
定義、宣言、またはその両方で?
テンプレート クラスとメソッドを作成した私の経験から、次のようにテンプレート関数を指定します。
template<typename T>
T MyFunc(T &aArg1, T &aArg2)
{
//...Definition Goes Here
}
はtypename T
テンプレート関数のテンプレート引数の型であり、そのデータ型を一貫して "T" とラベル付けされた各引数に渡す必要があります。これは、aArg2 が aArg1 のデータ型である必要があることを意味します。さて、この関数を呼び出すときは、次のように呼び出します:
MyFunc</*datatype*/int>(iArg1, iArg2);
2 つの引数はデータ型 "int" である必要があります。そうしないと、警告またはエラーが発生します。
さて、これはクラスによって提供される関数であるクラスメソッド(「クラスメンバー関数」の意味だと思います)にも適用されるMyClass::MyFunc()
ため(つまり)、テンプレートメソッドであるクラスメソッドを宣言するときは、それを行います同じように。クラスの例を次に示します。
class MyClass
{
MyClass();
~MyClass();
template<typename T>
static T MyStaticFunc(T aArg) { return aArg; }
template<typename T>
T MyFunc(T aArg) { return aArg; }
}
ご覧のとおり、難しくありません。さて、静的関数は、クラスが組み込まれている同じモジュールで定義する必要があるのと同じ方法です。そうしないと、エラーが発生します。
残念ながら、私は実際に「友達」の方法を使用したことがないので、それに取り組む方法がわかりません. 私はあなたが他の2つと同じ方法でそれを行うと思います. 回答のエッセイ全体がお役に立てば幸いです。
これらをClangで試してみると、次のことがわかります。
static
とstatic
関数の場合、定義または宣言のいずれかでデフォルトを指定することは許容されますが、両方ではなく、互いに矛盾する場合は確かにそうではありません。friend
、定義内でデフォルトを指定するclass
とエラーが発生します。