考虑以下使用“模板模板”参数实例化类模板的代码,使用多个类型:
看起来 GCC 无法绑定到 do_something,因为模板模板参数只声明了一个参数(枚举),但实际上 Foo 需要两个模板参数(尽管一个是默认的)。我想 GCC 4.1.2 允许忽略默认参数。
好的,如果我将模板定义更改为:
#include <iostream>
using namespace std;
enum E
{
a = 0,
b = 1
};
template <template <E> class Action, class T>
void do_something(const T& value)
{
typedef Action<a> type1;
typedef Action<b> type2;
}
template <E e, class Enable = void>
class Foo
{
};
int main()
{
do_something<Foo>(int(55));
}
使用旧版本的编译器(GCC 4.1.2),上述代码可以正常编译。然而,如果使用新版编译器(GCC 4.4.6或4.8.1),将会产生以下错误:
test3.cpp:25:27: error: no matching function for call to ‘do_something(int)’
do_something<Foo>(int(55));
看起来 GCC 无法绑定到 do_something,因为模板模板参数只声明了一个参数(枚举),但实际上 Foo 需要两个模板参数(尽管一个是默认的)。我想 GCC 4.1.2 允许忽略默认参数。
好的,如果我将模板定义更改为:
template <template <E, class> class Action, class T>
void do_something(const T& value)
{
typedef Action<a> type1;
typedef Action<b> type2;
}
如果我测试的GCC版本都无法编译它,那么所有的版本都会产生类似的错误:
test3.cpp:13: error: wrong number of template arguments (1, should be 2)
test3.cpp:10: error: provided for ‘template<E <anonymous>, class> class Action’
现在,编译器会抱怨表达式typedef Action<a> type1
只提供了一个模板参数。显然,在这里我不能隐式地使用默认参数。
是否有一种方法可以在模板模板函数中使用模板的默认参数?
do_something
中,能否将第一个class
替换为class=void
?这可能会告诉它Action
是一个带有一个默认参数的双参数模板。我认为我不希望这样工作,因为这意味着默认值被指定了两次! - Aaron McDaiddo_something
中指定的默认值都优先于在Foo
中指定的默认值。这有点奇怪,即使它是标准,我也不喜欢它。是否有更简洁的方法来创建一个单参数模板,该模板是一个带有一个默认参数的双参数模板的别名?据我所知,C++11 中的新的using
模板别名可能与此相关。 - Aaron McDaidC<A>
或C<B>
。但是,正如你所展示的那样,如果C
允许第二个参数有默认值,则需要一个具有两个参数的模板。 - Aaron McDaid