CLION 2017.3无法使用clang 5通过unique_ptr自动完成(与4.0.1一起使用)

时间:2018-02-05 06:35:23

标签: c++ clang clion clang++

编辑:滚动到下方的粗体部分,了解当前状态。

CLion似乎无法自动完成clang 5中unique_ptr指向的类型的成员。我要么得到“没有建议”,要么就unique_ptr本身的成员函数提出建议:

enter image description here

enter image description here

但是,使用4.0.1,一切正常:

enter image description here

我还注意到,如果我要求CLion跳转到->c->的定义,那么在4.0.1中它会找到它:

    _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();}

但是在5.0.0中,相同的命令说:Cannot find declaration to go to,所以这似乎更接近问题的根源。

shared_ptr-><AUTOCOMPLETE>在两个版本中均可正常使用。

<memory>unique_ptr::operator->的返回类型简化为element_type *的代码可以解决问题,但更改核心包含文件不是我喜欢做的事情。令人困惑的是,5.0中的部分代码与4.0.1中的代码相同,但工作正常。

  _LIBCPP_INLINE_VISIBILITY
  element_type * operator->() const _NOEXCEPT {
      return __ptr_.first();
  }  _LIBCPP_INLINE_VISIBILITY

    // original code that doesn't play nice with CLion
//    pointer operator->() const _NOEXCEPT {
//        return __ptr_.first();
//    }

我对任何解决方法感兴趣,甚至只是解释导致这种情况的原因。

我正在使用llvm下载站点的Mac预先构建的二进制文件。我想知道Apple clang编号方案与真实 clang版本号是否存在问题。也许铿锵声分析器认为我是在一些古老版本的(苹果)铿锵而不是现代的“真正的”铿锵声。

谢谢。

2 个答案:

答案 0 :(得分:0)

解决方法是更改​​unique_ptr::operator->标题中memory的返回类型。

  _LIBCPP_INLINE_VISIBILITY
  element_type * operator->() const _NOEXCEPT {
      return __ptr_.first();
  }  _LIBCPP_INLINE_VISIBILITY

    // original code that doesn't play nice with CLion
//    pointer operator->() const _NOEXCEPT {
//        return __ptr_.first();
//    }

使事情更有效,并且更加清晰地反映了shared_ptr中完成任务的方式,它开箱即用。

答案 1 :(得分:0)

我想在此跟进,以上(已接受的)解决方案也可以与unique_ptr的libstdc ++实现一起使用,至少是我正在使用的GCC 8.1随附的解决方案。

出于我详细介绍here的原因,另一种解决方案是您可以在using之类的结构开头添加一个using pointer = C*指令。这会使Netbeans正确地自动完成而没有警告。此解决方案可能特定于libstdc ++,但是根据您的回答,看来libc ++在内部使用了相同的指针类型名。