Подтвердить что ты не робот

Как включить завершение классов шаблонов С++ в vim с помощью YouCompleteMe

При использовании плагина vim YouCompleteMe для завершения кода на С++ я наткнулся на проблему. Использование вложенных классов шаблонов останавливает выполнение для правильной работы.

Рассмотрим следующий пример, чтобы воспроизвести поведение:

#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, последняя версия YCM от GitHub.

Изменить: В YCMs есть следующие проблемы: https://github.com/Valloric/YouCompleteMe/issues/243 https://github.com/Valloric/YouCompleteMe/issues/530

Кажется, это ошибка в clang, а не в YCM. Может кто-то подтвердить это?

Edit2: Я открыл еще одну проблему в отслеживателе проблем YCM. https://github.com/Valloric/YouCompleteMe/issues/1170

Цель состоит в том, чтобы получить больше информации о том, что именно ошибка в clang точно есть, и, наконец, сделать отчет об ошибке в трекер-проблеме.

Edit3: Я следовал предложенной процедуре от RedX и кормил свой код в clang, чтобы получить доработки. Clang не дает никаких предложений по обсуждаемым позициям в коде. Это явно является причиной того, почему YCM не делает предложений в vim, и это не имеет ничего общего с YCM или vim.

Отчет об ошибках в трекер-проблеме проблемы с кланом был подан: http://llvm.org/bugs/show_bug.cgi?id=20973

4b9b3361

Ответ 1

Я думаю, что в соответствии с правилами С++ вы не можете получить завершение в этом случае.

Без знания типа T мы не знаем, какие методы std::vector<T> будут иметь, так как каждое instansiation шаблона в С++ может иметь разные методы.