2015-01-08 2 views
-3

не имеет большой опыт работы с unique_ptrs еще, и у меня трудное время определить, почему я получаю сообщение об ошибке:возвращение члена unique_ptr от метода

error C2664: 'IFCC::IFCC(const IFCC &)' : cannot convert argument 1 from 'std::unique_ptr>' to 'IFO *' \Microsoft Visual Studio 12.0\VC\include\memory

Это код, который я думаю, что вызывает эту ошибку компиляции:

IFP.cpp:

std::unique_ptr<IFCC> IFPage::getIFCC() 
{ 
    return(make_unique<IFCC>(m_IFCC)); //recent add that is probably causing issue 
} 

IFP.h:

public: 
    std::unique_ptr<IFCC> getIFCC(); 
private: 
    unique_ptr<IFCC> m_IFCC = nullptr; 

По какой-то причине ошибка упоминает IFO, который является иерархическим родителем IFP. Кроме того, IFCC имеет родителя IFCCB, и как IFCC, так и IFCCB принимают параметр IFO. Если я просто создаю новый unique_ptr из IFCC, я не думаю, что ему нужен параметр, который IFCC требует, чтобы создать новый объект, так как я использую существующий объект для его создания.

Это, вероятно, некоторая синтаксическая ошибка, которую я где-то пропустил. Кажется, что возвращение значения не должно вызывать проблем.

Я смотрел unique_ptr info, и похоже, что у меня есть то, что у них есть, но мое приложение сложнее. Итак, есть ли у вас какие-либо данные об ошибке?

Я также видел stack overflow unique_ptr link и думаю, что это другой вопрос, потому что они спрашивают, как он реализован для компилятора и почему, тогда как мой вопрос касается того, как реализовать unique_ptr для возвращаемого значения. В их вопросе показан один оператор return, но я пытаюсь использовать make_unique, тогда как они создали новый unique_ptr и использовали эту переменную в качестве возвращаемого значения.

ответ

2

Вы не понимаете функцию make_unique, которая принимает переменные аргументы, т. Е. Создает шаблонный тип, пересылая аргументы, которые вы передаете ему. Одна из блестящих особенностей C++ 11 означает, что вам не нужно создавать множество шаблонов для аргументов 1, 2, 3, 4 и т. Д. В любое время, когда вы хотите использовать эту концепцию.

В вашем случае, если вы пытаетесь вызвать конструктор:

IFCC::IFCC(unique_ptr<IFCC>) 

, которые я думаю, не существует. Вместо этого компилятор пытается использовать ваш copy-constructor, который принимает ссылку на const для IFCC и не может преобразовать unique_ptr в этот тип.

Если это конструктор вы пытаетесь использовать, то есть копирование построить объект, который нужно будет:

make_unique(*m_IFCC); 

Вам потребуется потенциально проверить, что у вас есть объект. Ваш конструктор по умолчанию ставит член в nullptr, и если он все еще удерживает его, вы, вероятно, захотите также вернуть nullptr unique_ptr.

Я предполагаю, что вы не хотите возвращать unique_ptr. Это называется unique. у вас есть только один из них. Поэтому, если вы пытаетесь передать «по ссылке» переменную-член, ваш класс должен «отключить» ее.

То, что вы, вероятно, хотите на самом деле вернуть, - это просто ссылка или указатель на базовый объект. В качестве альтернативы, учитывая, что вы, похоже, копируете его, просто верните его по значению, предоставляя вызывающей стороне копию.

Если причина вы хотите вернуть unique_ptr потому, что это базовый класс к чему-то (как правило, хорошая причина, чтобы вернуться unique_ptr), вы, конечно, хотите реализовать функцию не вызывать конструктор копирования, который нарежьте бы ваш объект.

Reeturning unique_ptr Сделать это обычно делается, когда вы создаете совершенно новый объект, а не копируете существующий, и, конечно же, не пытаетесь предоставить доступ к элементу по ссылке.

Использование «отрешенного» объекта - это неопределенное поведение, единственное, что безопасно делать, - это вызвать его деструктор.

+0

Ваш конструктор является конструктором копирования, он ожидает ссылки на IFCC, я могу видеть его из генерируемого сообщения об ошибке. Он не принимает unique_ptr Я показал вам решение – CashCow

Смежные вопросы