晚期默认模板参数声明中的clang ++错误

时间:2015-04-21 15:38:04

标签: c++ templates clang++

下面的代码用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;
       ^

在一些小修复之后,错误就消失了,例如:

  1. 如果在前向声明中定义了默认模板参数而不是实际声明。
  2. 或者如果未使用DerivedFriend
  3. 但是,原始代码出了什么问题?

1 个答案:

答案 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]