Eclipse CDT indexing и std :: unique_ptr - PullRequest
       42

Eclipse CDT indexing и std :: unique_ptr

8 голосов
/ 17 января 2012

Я использую std :: unique_ptr в этом фрагменте кода, который компилируется и выполняется так, как я ожидал.

std::stringstream out;
out << std::setw(3) << std::setfill('0') << i;
std::unique_ptr<std::string> s(new std::string(out.str()));
s->insert(s->end()-2, 1, '.');
return std::move(s);

Тем не менее, я получаю сообщения об ошибках из Eclipse CDT.В четвертой строке: метод «вставка» не может быть разрешен, метод «конец» не может быть разрешен.

Ранее я также получал ошибки при появлении имени std :: unique_ptr.Это было решено путем установки символа препроцессора __GXX_EXPERIMENTAL_CXX0X__ и перестройки индекса, как описано в ответе на этот вопрос.

Есть ли способ заставить CDT понять, что sтипа std :: string * и что он должен искать в std :: string для s-> insert () и s-> end ()?

PS: я использую Eclipse 3.7.1 и CDT 8.0.0.201106081058

PS2: Мне бы хотелось опубликовать это как комментарий в приведенном выше вопросе, но я не могу, предположительно, потому что я новый пользователь

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Похоже, что индексатор Eclipse CDT не может определить тип unique_ptr :: pointer, который также используется в качестве возвращаемого типа оператора -> ().Это можно увидеть, когда вы наберете что-то вроде

std::unique_ptr<Type *> ptr;
ptr.reset(new Type);

, будет «обнаружена» ошибка, что не будет соответствующей перегрузки, и единственным кандидатом будет reset(?).Так что это явно ошибка.

2 голосов
/ 01 октября 2012

Эта проблема была недавно исправлена ​​в cdt 8.1.1.Просто зайдите в справку-> проверьте наличие обновлений, и они будут загружены и установлены.Я протестировал unique_ptr, и он правильно проиндексирован.

1 голос
/ 24 августа 2017

У меня та же проблема с более новой версией Eclipse CDT (9.3).Я перепробовал все трюки, которые нашел в интернете, каждый раз перестраивая индекс, надеясь на изменение.Но индексатору так и не удалось вывести тип std::unique_ptr<T>::operator->().Наконец, я решил использовать очень простой обходной путь:

# ifdef ECLIPSE_INDEXER_WORKAROUND
MyType* my_var;
# else
std::unique_ptr<MyType> my_var;
# endif    

Я добавляю ECLIPSE_INDEXER_WORKAROUND к символам препроцессора (конечно, только для параметров индексации, а не построения) в Eclipse, и индексация снова полезна!

Чтобы меньше загрязнять код, мы можем использовать макрос:

# ifdef ECLIPSE_INDEXER_WORKAROUND
#  define MY_UNIQUE_PTR( type ) type* 
# else
#  define MY_UNIQUE_PTR( type ) std::unique_ptr< type >
# endif

MY_UNIQUE_PTR( int ) pint{ new int(42) };
...