回答:
これはあなたがそれをする方法です:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings;
template<typename Type, typename IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
デフォルトはforward宣言にあり、実際の定義にはないことに注意してください。
テンプレートのデフォルト引数は、テンプレートの最初の宣言に対してのみ宣言できます。ユーザーがクラステンプレートを宣言して転送できるようにする場合は、転送ヘッダーを指定する必要があります。デフォルトを使用して他の人のクラステンプレートを転送宣言したい場合は、運が悪いです。
定義がデフォルトの引数を示すテンプレートクラスを宣言できますが、クラスを参照するときはいつでも、定義が導入されるまで、すべての引数を含める必要があります。
例えば。std::vector
含めずに使用しましょう(2番目の引数はstd::vector
デフォルトで定義されています):
namespace std
{
template<typename, typename>
class vector;
}
#include <iostream>
template <typename S, typename T>
void Foo (const std::vector<S,T> & vector)
{
std::cout << "do vector stuff, eg., display size = "
<< vector.size() << std::endl;
}
template <typename T>
void Foo (const T & t)
{
std::cout << "do non-vector stuff..." << std::endl;
}
次に、ベクターを含めずに使用できます。例:
int main()
{
Foo(3);
}
そして、私たちはそれを std::vector
例えばで使うことができます:
#include <vector>
// Now the compiler understands how to handle
// std::vector with one argument
// (making use of its default argument)
int main()
{
Foo(std::vector<int>(3));
}
私が上でこの作品の基準をチェックしますが、していないclang
/はgcc
して-std=c++98
まで-std=c++17
それが正式に標準ではありませんので、もしそれがそう非公式になりそうです。
Foo<> foo;
。