lsp-completion c++ 无法补全两层以上的成员操作((.)操作符)符

情况如下

  msg.body_.| // 不能补全
  msg.header_. // 也不能补全

其中msg是一个类,包括header_body_两个成员,其中,header_是一个struct,body_的类型是vector<uint8_t>,当光标在图示位置,而lsp-completion无法补全,手动触发提示没有找到补全

不止上面这种情况,我试了好多,都没有办法补全两层以上的成员操作符,不知道为什么,各位坛友有遇到过这样的问题吗?

多层可以补全。

我还发现了一个问题,好像连flycheck也失效了,正常来讲,一个vector有resize这个成员函数

msg.body_.resize()

但是我在没有补全的情况下将它打成了

msg.body_.resizzze()

居然什么报错都没有,不知道为什么。

之前都是没有问题的,那么就说明只能是lsp的问题,我且roll back试试

这两天一直在找原因,现在终于找到稳定的复现的方法了:

在模版类的友元函数里面,无法补全两层以上的成员操作符

#include <string>
#include <vector>
#include <iostream>

using namespace std;

template <typename MessageType>
struct MessageHeader {
  MessageType id_;
  vector<uint8_t> vec;

  friend void hello(MessageHeader<MessageType> msg, int data){
    msg.vec.| // 提示无法补全
  }

};

这样写的话无论是 clangd 还是 ccls 都没有办法触发补全,是我的写法有问题吗?

写法没问题。clangd就是在这个地方不支持。