默认模板参数如何工作?

cho*_*ger 4 c++ templates default-arguments

我知道很多关于模板默认参数语法的问题.

通常,答案(与我对它应该如何工作的理解同步)是使用类似的东西:

template <class T = SomeDefault> class T1 {};
Run Code Online (Sandbox Code Playgroud)

最近我想检查Boost在其中使用哪个地图实现mapped_vector.并找到以下代码段:

template<class T, class A>
class mapped_vector:
Run Code Online (Sandbox Code Playgroud)

显然,参数没有默认绑定A,但显然,我可以实例化mapped_vector<int>一下就好了.Obviosuly以某种方式推断出默认参数,但是如何?

编辑:准确地说,我在谈论这个文件中的第279行

Ven*_*Ven 7

这里的行(@ Xeo的链接)声明了模板.链接中的行定义它.注意:您不能指定一个在定义再次默认情况下,如果你决定要一个声明.

这有效:( Boost的版本)

template<typename T = int> class A;
template<typename T> class A {};
Run Code Online (Sandbox Code Playgroud)

这不起作用:

template<typename T = bool> class A;
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)

这既不是:

template<typename T = int> class A;
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在任何一个中声明它.这有效:

template<typename T> class A;
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)

虽然默认值只能声明一次,但它们不必全部在同一部件中声明.这有效,但请不要这样做:

template<class T, class U = bool> class A;
template<class T = int, class U> class A {};
Run Code Online (Sandbox Code Playgroud)

......没有限制,真的.这有效 :(责怪 - 或者谢谢 - @Xeo)

template<class T, class U, class V = double> class A;
template<class T, class U = bool, class V> class A;
template<class T = int, class U, class V> class A {};
Run Code Online (Sandbox Code Playgroud)

当然,你不会被迫提出声明.这有效:

template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)