使用带有 CRTP 的模板模板参数时,尝试在派生初始化列表中调用基类构造函数时出现编译错误。
可以使用以下代码片段复制问题:
template <template<class> class Derived, class T>
struct base
{
};
template <class T>
struct derived : public base<derived, T>
{
derived()
: base<derived, T>()
{ }
};
令人讨厌的错误消息:
bug.cpp:10:16: error: template argument for template template parameter must be a class template or type alias template
: base<derived, T>()
^
bug.cpp:10:11: error: expected class member or base class name
: base<derived, T>()
^
bug.cpp:10:11: error: expected '{' or ','
3 errors generated.
这个问题似乎只发生在 clang (3.4) 上,而不是 g++ (4.8, 4.7, 4.6)。我也在用 -std=c++11 编译。
这是我第一次需要使用带有模板模板参数的 CRTP。我这样做还好吗,这是否是 clang++ 的问题?
我最近比 g++ 更信任 clang++ 错误消息!