为简洁起见,示例代码省略了详细信息。让我们扩展示例:
template<class T, class U = T> class B { /* ... */ };
template<template<class> class P> class X {
P<int, int> pii; // error: P has been declared to take only one argument
P<int> pi; // OK
P<char> pc; // OK
/* ... */
};
X<B> xb; // OK in C++17; ill formed in C++14
最后一行解决
P<int>
作为
B<int>
. 确实,最后的手段
B<int, int>
,但鉴于默认参数,
B<INT>
是一个明确的方式来写。
原则上,据我所知,C++14没有理由不能理解这一点,但是对于C++14来说,推理链太复杂了。三年后,C++17理解了这一点。
顺便说一下,CLAN C++编译器提供了一个
-frelaxed-template-template-args
解决问题的选择。如果在clang上使用模板模板,则可以断言此选项。(@rakete1111因为引起了人们对clang选项的注意而被认可。)