如何完成C++;使用YouCompleteMe在vim中创建模板类 当使用VIM插件完成C++代码完成时,我遇到了一个问题。 使用嵌套模板类会停止完成以正常工作

如何完成C++;使用YouCompleteMe在vim中创建模板类 当使用VIM插件完成C++代码完成时,我遇到了一个问题。 使用嵌套模板类会停止完成以正常工作,c++,templates,vim,clang,code-completion,C++,Templates,Vim,Clang,Code Completion,考虑以下示例来重现该行为: #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&

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

#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"
}
#包括
模板
福班{
公众:
void Init();
私人:
结构条{
int foobar;
};
一巴;
std::向量一些_条;
};
模板
void foo::Init(){
one_bar.foobar=0;//按预期完成
某些_bar.at(0).foobar=0;//无论是“at”还是“foobar”都没有完成
}
“某些\u条”的代码完成根本不起作用,而“一个\u条”的行为符合预期

如何才能完成此代码的工作?这个问题是与设置相关的,并且应该实际工作,还是YCM中的一个bug

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

编辑: YCMs bug tracker中报告了类似的问题:

似乎是叮当声中的bug,而不是YCM中的bug。有人能证实这一点吗

编辑2: 我在YCM问题跟踪中打开了另一个问题。

这样做的目的是获取更多关于clang中的bug到底是什么的信息,并最终在clang问题跟踪程序中生成bug报告

编辑3: 我遵循RedX提出的过程,用叮当声输入代码以获得完成。 Clang没有对准则中讨论的位置提供任何建议。 这显然是YCM未能在vim中提出建议的原因,与YCM或vim无关

clang issue tracker中的错误报告已存档:

我认为,在C++规则下,在这种情况下不能完成。

不知道类型<代码> t>代码>,我们不知道什么方法>代码> STD::vector < /C> >,因为C++中的每个模板都可以有不同的方法。

AS @ Chris Jefferson在理论上是不可能的。 此注释不考虑模板专门化


在这里显示的代码中,所有的补全都是清楚的,即使不知道类型T。它不是std::vector,而是std::vector

当我试图在不扣除模板的情况下为模板编写专门化时,我在一个非常不同的上下文中遇到了这种情况。我将提供我的示例以澄清这种情况。假设您有一个枚举器,您有一个meta_info类,该类定义了模板使用的枚举器的大小,因此:

enum类e{a,b};
模板
结构元信息;
模板
元信息{
静态constexpr size\u t s=2;
}
好的,这样做很好,但是如果您尝试在嵌套在模板类中的枚举器中执行相同的操作,会发生什么呢

模板
结构str{
枚举类e{a,b};
}
模板
结构元信息;
模板
元信息{
静态constexpr size\u t s=2;
}

这不会编译,因为其他人(代码的另一部分)可能会通过另一个专门化更改
e
。编译器没有正式的方法知道专门化是否会在编译的第一个过程中更改类型。请记住,自动完成工具大多数时候只是使用includes路径来查找建议,这是不可能的。因此,在未来,我希望在ycm中看到类似非正式实例化的东西

这个问题在So上获得令人信服的答案的可能性接近于0。YCM只是clang的一个黑客前端,为什么不直接尝试一下呢?Valloric似乎已经确认了这是一个bug/在你发布的问题中clang不支持它。@FDinoff:悬赏是为了解释问题的确切位置以及如何解决问题。@Romaill:我对clang一无所知,所以我不知道从哪里开始。因此悬赏:我需要有人解释一下clang中的问题在哪里,并可能在那里打开一个问题。YCM对于很多人来说都是一个很棒的工具,这是一个让它变得更好的机会。试着把这个片段输入到clang中,并要求它为您提供完整性。有关如何从中的命令行/std执行此操作的信息,请参见。然后,也许您可以创建一个可复制的示例。在这里显示的代码中,所有的补全都是清楚的,即使不知道类型T。它不是std::vector,而是std::vector。