我的问题可以通过下面的代码段恢复:模板法和默认模板参数
template <typename T> struct C2;
template <typename T>
struct C1
{
template <typename Type,
template <typename Ti> class Container = C2>
void m() {}
};
template <typename T>
struct C2
{
template <typename Type = int,
template <typename Ti> class Container = C2> // <-- Here is the problem!
void m() {}
};
GNU编译器,版本4.8.1失败,出现以下消息:
test-temp.C:16:47: error: invalid use of type ‘C2<T>’ as a default value for a template template-parameter
template <typename Ti> class Container = C2>
它指的是方法C2 :: m的默认模板参数C2。
显然(这是我的意见),编译器看到C2<T>
作为默认参数,而不是C2
(没有<T>
)。因此,当它发现指令失败时,因为类型C2<T>
与Container
不匹配。
但是,铿锵++,只是为了完全相同的代码,编译好!
我的问题:
- 哪个编译器有真相?
- 是否有一些替代方案与gnu编译器的当前版本表达相同的意义?
在此先感谢
莱昂德罗
g ++是错误的,铿锵是正确的,也是模板模板中的名称是可选的 – aaronman