Метод TLDR 1
Добавление директивы using pointer = {structName}*
в вашу структуру исправляет помощь кода и будет компилироваться и запускаться, как и предполагалось, например:
struct C { using pointer = C*; int a;};
Метод TLDR 2
Ответ , на который я ссылаюсь в моем редактировании, фактически работает и для libstdc ++. Простое изменение типа возврата unique_ptr::operator->()
с pointer
на element_type*
исправит помощь кода, скомпилирует и запустит, как и ожидалось (то же самое можно сделать с unique_ptr::get()
). Тем не менее, меняются вещи в реализациях стандартной библиотеки.
Дополнительная информация
Как человек, который является относительно новым для c ++ и едва понимает силу специализаций шаблонов. чтение через unique_ptr.h
было страшным, но вот что, мне кажется, портит Netbeans:
- вызов
unique_ptr::operator->()
вызовов unique_ptr::get()
unique_ptr::get()
вызывает частную реализацию (__unique_ptr_impl
) функция указателя __unique_ptr_impl::_M_ptr()
. Все эти вызовы возвращают тип __unique_ptr_impl::pointer
. - В частной реализации тип
pointer
определен в еще более частной реализации _Ptr
. Структура _Ptr
имеет два определения шаблона, одно из которых возвращает необработанный указатель на начальную переменную шаблона unique_ptr
, а второе, кажется, удаляет любую ссылку из этой переменной шаблона, а затем находит ее тип с именем pointer
. Я думаю, что это где Netbeans портится.
Итак, насколько я понимаю, когда вы вызываете unique_ptr<elementType, deleterType>::operator->()
, он переходит к __unique_ptr_impl<elementType, deleterType>
, где внутренний тип указателя определяется путем удаления elementType
любых ссылок и последующего получения типа с именем dereferenced(elementType)::pointer
. Таким образом, включив директиву using pointer =
, Netbeans получает то, что хочет, при поиске типа dereferenced(elementType)::pointer
.
Включение директивы using
совершенно поверхностно, о чем свидетельствует тот факт, что вещи будут компилироваться без него, и в следующем примере
#include <memory>
#include <iostream>
struct A{
using pointer = A*;
double memA;
A() : memA(1) {}
};
struct B {
using pointer = A*;
double memB;
B() : memB(2) {}
};
int main() {
unique_ptr<A> pa(new A);
unique_ptr<B> pb(new B);
std::cout << pa->memA << std::endl;
std::cout << pb->memB << std::endl;
};
выводит
1
2
Как и должно быть, хотя в структуре B содержится using pointer = A*
. Netbeans на самом деле пытается автозаполнить B->
до B->memA
, что является еще одним доказательством того, что Netbeans использует предложенную выше логику c.
Это решение придумано как ад, но по крайней мере работает (в c контекст, который я использовал) без внесения изменений в реализации stl. Кто знает, я все еще запутался в запутанной системе ввода в unique_ptr
.