Answers:
这是您的操作方式:
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 }
...
};
请注意,默认设置在前向声明中,而不在实际定义中。
您只能为模板的第一个声明声明模板的默认参数。如果要允许用户转发声明类模板,则应提供转发标头。如果您想使用默认值来声明其他人的类模板,那您真不走运!
您可以声明一个模板化的类,其定义指出默认参数,但是任何时候引用该类时,都必须包括其所有参数,直到引入定义为止。
例如。让我们在std::vector
不包含它的情况下使用它(其第二个参数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;
。