下面的代码用g ++编译好,但不能用clang ++(3.6)编译:
// Forward declaration:
template <class S, class T>
struct Base;
template <class T>
struct BaseFriend {
friend struct Base<int, T>;
};
// Actual declaration:
template <class S, class T = int>
struct Base {
void foo() {}
};
struct DerivedFriend : BaseFriend<int> {};
struct Derived : Base<int> {
void foo(int) {
Base<int>::foo();
}
};
Derived::foo
定义中出现错误:
error: too few template arguments for class template 'Base'
Base<int>::foo();
^
test.cpp:3:8: note: template is declared here
struct Base;
^
在一些小修复之后,错误就消失了,例如:
DerivedFriend
。但是,原始代码出了什么问题?
答案 0 :(得分:4)
绝对是一个铿锵的bug,看起来像#10147。该标准明确允许这[temp.param] / 10:
获取可用于模板声明或定义的默认模板参数集 通过合并定义中的默认参数(如果在范围内)和范围中的所有声明相同 方式默认函数参数是(8.3.6)。 [例如:
template<class T1, class T2 = int> class A; template<class T1 = int, class T2> class A;
相当于
template<class T1 = int, class T2 = int> class A;
-end example]