При использовании плагина 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
Я думаю, по правилам C ++, вы не можете получить завершение в этом случае.
Без знания типа T
мы не знаем какие методы std::vector<T>
будет иметь, так как каждый экземпляр шаблона в C ++ может иметь разные методы.