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

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

Редактировать:
В трекере ошибок YCM есть похожие проблемы:
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, и, наконец, сделать отчет об ошибке в трекере проблем clang.

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

Сообщение об ошибке в трекере clang было отправлено:
http://llvm.org/bugs/show_bug.cgi?id=20973

25

Решение

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

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

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector