当使用vim插件YouCompleteMe实现C++代码完成时,我偶然发现了一个问题。
使用嵌套模板类会使完成工作无法正常进行。

请考虑以下示例来重现该行为:

#include <vector>

template<class T>
class foo {
  public:
  void Init();

  private:
  struct bar {
    int foobar;
  };
  bar one_bar;
  std::vector<foo<T>::bar> some_bars;
};

template<class T>
void foo<T>::Init(){
  one_bar.foobar = 0; // completion as expected
  some_bars.at(0).foobar = 0; // no completion neither for "at" nor for "foobar"
}

“some_bars”的代码完成完全不起作用,而“one_bar”的行为却与预期的一样。

我如何才能完成此代码的工作?此问题与设置有关并且应该可以正常工作吗?还是YCM中的错误?

我的系统是基于debian jessie/sid的,vim版本7.4,是GitHub的YCM最新版本。

编辑:
YCM的错误跟踪器中报告了类似的问题:
https://github.com/Valloric/YouCompleteMe/issues/243
https://github.com/Valloric/YouCompleteMe/issues/530

似乎是在clang中而不是YCM中的错误。有人可以确认吗?

编辑2:
我在YCM问题跟踪器中打开了另一个问题。
https://github.com/Valloric/YouCompleteMe/issues/1170

目的是获得有关clang中的确切错误的更多信息,并最终在clang问题跟踪器中报告错误。

编辑3:
我遵循RedX提出的建议过程,并用clang填充了我的代码以获取完成。
Clang没有为代码中的讨论位置提供任何建议。
这显然是YCM无法在vim中提出建议的原因,而与YCM或vim无关。

已提交clang问题跟踪器中的错误报告:
http://llvm.org/bugs/show_bug.cgi?id=20973

最佳答案

我认为,根据C++的规则,在这种情况下您无法获得完成。

在不了解T类型的情况下,我们不知道std::vector<T>将使用哪些方法,因为C++中模板的每个实例都可以具有不同的方法。

07-27 13:24