Ошибка компиляции при передаче умного указателя на функцию-член класса шаблона - PullRequest
0 голосов
/ 12 апреля 2019

Я сталкиваюсь с ошибкой компиляции при передаче 1. уникальный ptr для функции-члена класса шаблона 2. содержимое уникального указателя на функцию-член класса шаблона

Я пытаюсь вставить данные в вектор. Данные имеют тип шаблона. Уникальный указатель здесь используется здесь для создания памяти в куче каждый раз, когда поступают данные, и затем сохраняет эти данные в векторе. Даже копирование указателя, указывающего на новое местоположение, также может быть помещено внутрь вектора. Я пробовал оба 1. Сбор данных с использованием T item; // код ниже 2. Поймать уникальный указатель по ссылке, используя std :: unique_ptr & item; Пример кода является своего рода фрагментом длинного кода

#include <stdio.h>
#include<iostream>
#include<vector>
#include <mutex>
#include <condition_variable>
#include <boost/any.hpp>
using namespace std;
namespace amb
{

template <typename T>
class Queue
{
public:
        Queue(bool unique = false, bool blocking = false)
                :mUnique(unique), mBlocking(blocking)
        {
        }
        virtual ~Queue()
        {
        }
        int count()
        {
                std::lock_guard<std::mutex> lock(mutex);
                return mQueue.size();
        }
        T pop()
        {
                std::unique_lock<std::mutex> lock(mutex);
                uint16_t i =0;
                if(mBlocking)
                {
                        if(!mQueue.size())
                        {
                                cond.wait(lock);
                        }
                }
                if(!mQueue.size())
                {
                        throw std::runtime_error("nothing in queue");
                }
                auto itr = mQueue.begin();
                T item = *itr;
                mQueue.erase(itr);
                return item;
        }

        virtual void append(T  item)
        {
            std::lock_guard<std::mutex> lock(mutex);
                        mQueue.push_back(item);
        }
        void remove(T item)
        {
                std::lock_guard<std::mutex> lock(mutex);

                removeOne(&mQueue, item);
        }
        std::vector<T> get_Val()
        {
                return mQueue;
        }
    private:
        bool mBlocking;
        bool mUnique;
        std::mutex mutex;
        std::condition_variable cond;
        std::vector<T> mQueue;
};
}

class AbstractPropertyType
{
public:
 AbstractPropertyType(){}

 virtual ~AbstractPropertyType()
    {

    }

 virtual AbstractPropertyType* copy() = 0;
 boost::any anyValue()
    {
        return mValue;
    }
 protected:

    boost::any mValue;
};

template <typename T>
class BasicPropertyType: public AbstractPropertyType
{
public:
    BasicPropertyType(): AbstractPropertyType("")
    {
        mValue = T();
    }
    AbstractPropertyType* copy()
    {
        return new BasicPropertyType<T>(*this);
    }
};
amb::Queue<AbstractPropertyType*> prop;
void updateProperty(AbstractPropertyType * val)
{
    std::unique_ptr<AbstractPropertyType> temp_data =  std::unique_ptr<AbstractPropertyType>(val->copy());
    prop.append(temp_data);
}
int main() {
    //code
    uint8_t x = 10;
    uint8_t * test_val = &x;
    boost::any to_check = (uint8_t *)test_val;
    AbstractPropertyType * value = new BasicPropertyType<uint32_t>;
    updateProperty(value);
}

Основной девиз 1. Либо вставьте содержимое данных шаблона в вектор 2. Указатель, указывающий на

Ошибка компиляции: prog.cpp: в функции 'void updateProperty (AbstractPropertyType *)': prog.cpp: 109: 26: ошибка: отсутствует соответствующая функция для вызова 'amb :: Queue :: append (std :: unique_ptr &)' prop.append (temp_data); ^

1 Ответ

0 голосов
/ 12 апреля 2019
amb::Queue<AbstractPropertyType*> prop;

Итак, prop.append() принимает аргумент типа AbstractPropertyType*, но вы отправляете temp_data типа std::unique_ptr<AbstractPropertyType>. Поскольку функция append ожидает необработанный указатель, вы должны передать необработанный указатель внутри него. Не существует неявного преобразования из unique_ptr<T> в T*.

void updateProperty(AbstractPropertyType * val)
{
    std::unique_ptr<AbstractPropertyType> temp_data =  std::unique_ptr<AbstractPropertyType>(val->copy());
    prop.append(temp_data.get());
}
...