Завершение на участниках класса, которые являются контейнерами STL, перестало работать.
Завершение на локальных объектах, которые являются контейнерами STL, хорошо работает.
Например, учитывая следующие файлы:
// foo.h
#include <string>
class foo {
public:
void set_str(const std::string &);
std::string get_str_reverse( void );
private:
std::string str;
};
// foo.cpp
#include "foo.h"
using std::string;
string
foo::get_str_reverse ( void )
{
string temp;
temp.assign(str);
reverse(temp.begin(), temp.end());
return temp;
} /* ----- end of method foo::get_str ----- */
void
foo::set_str ( const string &s )
{
str.assign(s);
} /* ----- end of method foo::set_str ----- */
Я генерировал теги для этих двух файлов использование:
ctags -R --c++-kinds=+pl --fields=+iaS --extra=+q .
Когда я ввожу temp.
в cpp я получаю список string
функции членства как ожидалось. Но если я ввожу str.
omnicppcomplete выкладывает "Шаблон, Не Найденный".
Я заметил что temp.
завершение только работает, если я имею using std::string;
объявление.
Как я заставляю завершение работать над моими участниками класса, которые являются контейнерами STL?
Править
Я нашел, что завершение на участниках, которые являются работами контейнеров STL, если я делаю следовать модификации к заголовку:
// foo.h
#include <string>
using std::string;
class foo {
public:
void set_str(const string &);
string get_str_reverse( void );
private:
string str;
};
В основном, если я добавляю using std::string;
и затем удалите std::
спецификатор пространства имен от string str;
участник и повторно создает файл тегов затем, OmniCppComplete может сделать завершение на str.
.
Это, кажется, не имеет значения, имею ли я let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
набор .vimrc
.
Проблемой является то помещение using
объявления в заголовочных файлах походят на большое нет - нет, таким образом, я возвращаюсь к начальной ситуации.
Попробуйте установить эту переменную:
let OmniCpp_NamespaceSearch=1
Если она работает, не забудьте поместить ее в свой файл конфигурации .vimrc
!
Недавно я перешел на Ubuntu 10.04, который включает ctags 5.8, и у меня больше нет этой проблемы с классами STL, такими как строка, однако завершение по-прежнему не работает с настоящими контейнерами, такими как вектор.
Это мой старый ответ для ctags 5.7:
Хотя это немного похоже на взлом, я нашел решение, которое не загрязняет файлы заголовков директивами
и предоставляет OmniCppComplete с все, что нужно для завершения членов класса, которые являются контейнерами STL.
#include <string>
#if 0
using std::string;
#else
# define string std::string
#endif
class foo {
public:
void set_str(const string &);
string get_str_reverse( void );
private:
string str;
};
#ifdef string
# undef string
#endif
Затем измените строку в файле .vimrc
, который генерирует ctags следующим образом:
map <C-F12> :!ctags -R --c++-kinds=+pl --fields=+iaS --extra=+q --if0=yes .<CR>
Как это работает? Когда ctags
видит параметр - if0 = yes
, он берет ветвь #if 0
директивы препроцессора и генерирует необходимую запись в теги
файл:
str omnitest.h /^ string str;$/;" m class:foo access:private
OmniCppComplete видит поддельный с помощью std :: string;
и, когда не может найти определение для строки
, он ищет в std
и находит его там.
А при компиляции с g ++ результат - это то, что нам нужно. Это можно проверить, запустив файлы через препроцессор:
$ g++ omnitest.cpp -E | less
В конце вы увидите:
# 2 "omnitest.h" 2
class foo {
public:
void set_str(const std::string &);
std::string get_str_reverse( void );
private:
std::string str;
};
# 2 "omnitest.cpp" 2
using std::string;
string foo::get_str_reverse ( void )
{
string temp;
temp.assign(str);
reverse(temp.begin(), temp.end());
return temp;
}
void foo::set_str ( const string &s )
{
str.assign(s);
}
Так, например, если я наберу this-> str.
в одной из функций-членов он теперь дает мне список строковых членов для завершения.
Этот метод может использоваться для любого набора контейнеров STL и даже может быть автоматизирован для изменения заголовка при возврате или извлечении из репозитория Subversion с помощью сценария Perl.
Так товарищам по команде не нужно будет видеть ваши уродливые хаки: -)