unique_ptr с заранее объявленным незавершенным типом не скомпилируется [duplicate]

Еще один трюк, о котором еще не упоминалось, заключается в том, чтобы класс, который реализует свойство (например, Foo типа Bar), также определяет делегат delegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2); и реализует метод ActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1) (и, возможно, версии для двух и трех «дополнительные параметры»), который передаст свое внутреннее представление Foo в прилагаемую процедуру как параметр ref. Это имеет несколько больших преимуществ перед другими методами работы с этим свойством:

  1. Свойство обновляется «на месте»; если свойство имеет тип, совместимый с методами `Interlocked`, или если это структура с открытыми полями таких типов, методы` Interlocked` могут использоваться для выполнения атомных обновлений свойства.
  2. Если свойство является структурой открытого поля, поля структуры могут быть изменены без необходимости делать какие-либо избыточные копии.
  3. Если метод `ActByRef` передает один или несколько параметров` ref` через своего вызывающего абонента в предоставленный делегат, возможно, будет возможно использовать однотонный или статический делегат, что позволит избежать необходимости создания закрытий или делегатов во время выполнения.
  4. Свойство знает, когда оно «работает с». Хотя всегда необходимо использовать осторожность при выполнении внешнего кода, удерживая блокировку, если кто-то может доверять вызывающим абонентам, чтобы они не делали ничего в своем обратном вызове, что может потребовать другой блокировки, может быть целесообразным, чтобы метод защищал доступ к свойствам с помощью блокировки, так что обновления, которые не совместимы с `CompareExchange`, могут выполняться квазиатомно.

Передача вещей будет ref отличной картиной; слишком плохо, что он больше не используется.

2
задан AppD3veloper 26 June 2019 в 22:07
поделиться

1 ответ

Как упомянуто CuriouslyRecurringThoughts и Jarod42, проблема была связана с присвоением nullptr m_ageDetectImplPtr

Следующий код работает

    class AgeDetectImpl;
    class AgeDetect {
    public:
        AgeDetect(std::string token);
        ~AgeDetect();

        std::string getAge(std::string imagepath);
        std::string getAge(uint8_t* buffer, size_t rows, size_t cols);
        std::string getAge(const cv::Mat& image);

    private:
        std::unique_ptr<AgeDetectImpl> m_ageDetectImplPtr;
    };
0
ответ дан AppD3veloper 26 June 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: