情况如下
msg.body_.| // 不能补全
msg.header_. // 也不能补全
其中msg是一个类,包括header_
与body_
两个成员,其中,header_
是一个struct,body_
的类型是vector<uint8_t>
,当光标在图示位置,而lsp-completion无法补全,手动触发提示没有找到补全
不止上面这种情况,我试了好多,都没有办法补全两层以上的成员操作符,不知道为什么,各位坛友有遇到过这样的问题吗?
情况如下
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就是在这个地方不支持。