编辑:滚动到下方的粗体部分,了解当前状态。
CLion似乎无法自动完成clang 5中unique_ptr指向的类型的成员。我要么得到“没有建议”,要么就unique_ptr
本身的成员函数提出建议:
但是,使用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->
的返回类型简化为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版本号是否存在问题。也许铿锵声分析器认为我是在一些古老版本的(苹果)铿锵而不是现代的“真正的”铿锵声。
谢谢。
答案 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 ++在内部使用了相同的指针类型名。