我的问题可以通过以下代码恢复:
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
.
然而,clang++,只是对于完全相同的代码,编译得很好!
我的问题:
- 哪个编译器有真相?
- 是否有其他方法可以与当前版本的 gnu 编译器表达相同的含义?
提前致谢
莱安德罗