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

标签 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

但是,原始代码有什么问题呢?

最佳答案

绝对是一个 clang 错误,看起来像 #10147 .该标准明确允许此 [temp.param]/10:

The set of default template-arguments available for use with a template declaration or definition is obtained by merging the default arguments from the definition (if in scope) and all declarations in scope in the same way default function arguments are (8.3.6). [ Example:

template<class T1, class T2 = int> class A;
template<class T1 = int, class T2> class A;

is equivalent to

template<class T1 = int, class T2 = int> class A;

—end example ]

关于c++ - 晚期默认模板参数声明的 clang++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776850/

相关文章:

C++ 如何在类中缓存模板类型 T 的变量?

c++ - emplace_back 初始化列表错误,当初始化列表对独立变量起作用时

c++ - 编译模板时出现 clang 错误

c++ - 从括号内的 initializer_list 构造时调用了错误的重载

c++ - 带有选项卡式窗口和分隔线的 Source Insight 类型编辑器?

c++ - 我可以/应该从 Boost.Fusion 序列继承吗?

c# - 共享来自 C#、C++/CLI 和 C++ 的枚举

c++ - 包含引用另一个 vector 内容的 vector 的对象

C++模板类问题

c++ - clang++ - 将模板类名视为类范围内的模板