Индексирование CDT Eclipse и std:: unique_ptr

Я использую 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. В четвертой строке: метод "insert" не может быть разрешен, метод "конец" не может быть разрешен.

Раньше я также получал ошибки при появлении имени 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: Мне бы хотелось опубликовать это как комментарий в вышеуказанном вопросе, но я не могу, по-видимому, потому, что я новый пользователь

Ответ 1

Кажется, что индексатор Eclipse CDT не может выводить тип unique_ptr:: указателя, который также используется как возвращаемый тип оператора → (). Вы можете видеть это, когда вы вводите что-то вроде

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

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

Ответ 2

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

Ответ 3

У меня такая же проблема на более новой версии 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) };