C ++ Невозможно преобразовать из deferred :: SafePtr <T>в T * - PullRequest
0 голосов
/ 11 августа 2011

Я сделал тестовый пример, чтобы показать проблемы, с которыми я сталкиваюсь. Пожалуйста, прости меня за мое невежество по вопросам отложенных библиотек и приведения указателей. Единственная библиотека, включенная в deferred.lib.

#include <deferred/deferred.h>

using namespace deferred;

SafePtr<Deferred> recordTime(int time)
{
    SafePtr<Deferred> d = createDeferred();
    SafePtr<CallbackData> p = new PointerCBD< char>( 0 );
    d->execute(p);
    return d;
}

int main(int argc, char* argv[])
{
    while(1)
    {
        SafePtr<Deferred> d = recordTime(1000);
        d->waitHereForCompletion();
        char* c = dynamic_pointer_cast<char>(d->endResult());
    }
    return 0;
}

Когда я пытаюсь скомпилировать в Windows XP с VS2008, я получаю:

Ошибка C2440: «инициализация»: невозможно преобразовать из 'deferred: SafePtr' в 'char *' с [Т = символ]

Нет оператора пользовательского преобразования, который мог бы выполнить это преобразование или оператор не может быть вызван.

Я пробовал эту команду, чтобы вернуть указатель, а не SafePtr:

ManagerTimings* t = dynamic_pointer_cast<ManagerTimings>(d->endResult()).get();

Тогда я получаю эту ошибку:

Ошибка C2664: 'deferred :: intrusive_ptr_release': невозможно преобразовать параметр 1 от 'char *' до 'deferred: ReferenceCountable *'

Я пробовал эту команду:

ManagerTimings* t = dynamic_pointer_cast<ManagerTimings>(d->endResult().get());

Тогда я получаю эту ошибку:

Ошибка C2784: 'deferred :: SafePtr deferred :: dynamic_pointer_cast (const deferred :: SafePtr &)': не удалось вывести аргумент шаблона для 'const deferred :: SafePtr &' from 'deferred :: CallbackData * '

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Попробуйте:

ManagerTimings* t = dynamic_pointer_cast<ManagerTimings>(d->endResult().get());

, если вы хотите получить «небезопасный» указатель, или, возможно, это:

SafePtr<ManagerTimings> t= dynamic_pointer_cast<ManagerTimings>(d->endResult());

, чтобы получить безопасный ManagerTimings указатель.Я не знаю, какую библиотеку вы используете, но я подозреваю, что dynamic_pointer_cast может преобразовать SafePtr в другую SafePtr.Или он просто конвертирует указатели.

0 голосов
/ 11 августа 2011
&*d->endResult()

Я думаю, из этого кода endResult - это SafePtr, с которым у вас проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...