相关疑难解决方法(0)

clang ++在使用CRTP时不接受使用模板模板参数

当在CRTP中使用模板模板参数时,尝试在派生初始化列表中调用基类构造函数时,我遇到编译错误.

可以使用以下代码片段复制问题:

template <template<class> class Derived, class T>
struct base
{
};

template <class T>
struct derived : public base<derived, T>
{
    derived()
        : base<derived, T>()
    { }
};
Run Code Online (Sandbox Code Playgroud)

违规错误消息:

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.
Run Code Online (Sandbox Code Playgroud)

这个问题似乎只出现在clang(3.4)上,而不是g ++(4.8,4.7,4.6).我正在使用-std = c ++ 11进行编译.

这是我第一次使用CRTP和模板模板参数.我这样做是否正确,这是clang …

c++ templates clang crtp c++11

19
推荐指数
1
解决办法
1600
查看次数

类名注入和构造函数

最近,在将库更新到Clang 5.x时,我注意到我的代码中的一个错误,该错误先前已在Clang 4.x,GCC 5.x-6.x和MSVC 2015和2017上编译.

#include <iostream>
#include <typeinfo>
#include <vector>

int main()
{
    using a = typename std::vector<int>::vector;
    std::cout << typeid(a).name() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Clang-5.x产生以下警告消息,而所有其他编译器以静默方式编译上述代码:

a.cpp:7:42: warning: ISO C++ specifies that qualified reference to 'vector' is a
  constructor name rather than a type in this context, despite preceding
  'typename' keyword [-Winjected-class-name]
using a = typename std::vector<int>::vector;
Run Code Online (Sandbox Code Playgroud)

哪个编译器有问题?假设Clang5.x在此处具有正确的行为,并且所有其他编译器(和版本)都不正确,我是否正确.如果是这样,是否值得向MSVC和GCC提交错误报告?

c++ clang language-lawyer

13
推荐指数
1
解决办法
921
查看次数

标签 统计

c++ ×2

clang ×2

c++11 ×1

crtp ×1

language-lawyer ×1

templates ×1