在延迟默认模板参数声明中出现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;
       ^

经过一些小修正后错误消失,如:

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


    绝对是一个铿锵虫,看起来像#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;
    

    - 例子]

    链接地址: http://www.djcxy.com/p/84575.html

    上一篇: clang++ error on late default template parameter declaration

    下一篇: Disable Whole Redactor.js WYSIWYG Editor