Индексирование 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) };