CLion 2017.3 无法使用 clang 5 通过 unique_ptr 自动完成(适用于 4.0.1)
CLion 2017.3 unable to autocomplete through unique_ptr using clang 5 (works with 4.0.1)
编辑:滚动到下面的粗体部分了解当前状态。
CLion 似乎无法自动完成 clang 5 中 unique_ptr 指向的类型的成员。我要么得到 "no suggestions",要么得到关于 [=13= 成员函数的建议] 本身:
但是,对于 4.0.1,一切正常:
我还注意到,如果我要求 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->
的 return 类型的代码简化为 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 编号方案与 real clang 版本号的问题。也许 clang 分析器认为我使用的是一些古老版本的 (apple) clang 而不是现代 "real" clang。
谢谢。
解决方法是更改 memory
header 中 unique_ptr::operator->
的 return 类型。
_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
中的工作方式,开箱即用。
我想在这里跟进,上面的(已接受的)解决方案也适用于 unique_ptr
的 libstdc++ 实现,至少是我正在使用的 GCC 8.1 附带的那个。
另一种解决方案,出于我详细说明的原因 ,您可以在结构的开头添加一个 using
指令,例如 using pointer = C*
。这会愚弄 Netbeans 使其在没有警告的情况下正确地自动完成。此解决方案可能特定于 libstdc++,但根据您的回答,看起来 libc++ 在内部使用相同的类型名称作为指针。
编辑:滚动到下面的粗体部分了解当前状态。
CLion 似乎无法自动完成 clang 5 中 unique_ptr 指向的类型的成员。我要么得到 "no suggestions",要么得到关于 [=13= 成员函数的建议] 本身:
但是,对于 4.0.1,一切正常:
我还注意到,如果我要求 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->
的 return 类型的代码简化为 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 编号方案与 real clang 版本号的问题。也许 clang 分析器认为我使用的是一些古老版本的 (apple) clang 而不是现代 "real" clang。
谢谢。
解决方法是更改 memory
header 中 unique_ptr::operator->
的 return 类型。
_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
中的工作方式,开箱即用。
我想在这里跟进,上面的(已接受的)解决方案也适用于 unique_ptr
的 libstdc++ 实现,至少是我正在使用的 GCC 8.1 附带的那个。
另一种解决方案,出于我详细说明的原因 using
指令,例如 using pointer = C*
。这会愚弄 Netbeans 使其在没有警告的情况下正确地自动完成。此解决方案可能特定于 libstdc++,但根据您的回答,看起来 libc++ 在内部使用相同的类型名称作为指针。