【问题标题】:Compilation Error on passing smart pointer to a template class member function将智能指针传递给模板类成员函数时出现编译错误
【发布时间】:2019-09-02 20:12:27
【问题描述】:

我在传递时遇到编译错误 1. 模板类成员函数的唯一ptr 2. 模板类成员函数唯一指针的内容

我正在尝试将数据推送到 vector 中。数据为模板类型。 这里的唯一指针在这里用于在每次数据到来时在堆上创建一个内存,然后将该数据存储到向量中。 即使复制指向新位置的指针也可以推入向量中。 我都试过了 1. 使用T项捕获数据;//下面提到的代码 2. 使用 std::unique_ptr & item 通过引用捕获唯一指针; 示例代码是长代码的一种 sn-p

#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.要么将Template数据的内容推入vector 2.指针指向

编译错误: prog.cpp:在函数'void updateProperty(AbstractPropertyType *)'中: prog.cpp:109:26: 错误: 没有匹配函数调用'amb::Queue::append(std::unique_ptr&)' prop.append(temp_data); ^

【问题讨论】:

  • 错误很明显。原始指针不是智能指针。
  • @wilx,对不起,我听不懂,你能详细说明一下吗?你说的是哪个原始指针

标签: c++ templates smart-pointers


【解决方案1】:
amb::Queue<AbstractPropertyType*> prop;

所以,prop.append() 接受AbstractPropertyType* 类型的参数,但您发送temp_data 类型为std::unique_ptr&lt;AbstractPropertyType&gt;。由于append 函数需要一个原始指针,因此您应该在其中传递原始指针。没有从unique_ptr&lt;T&gt;T* 的隐式转换。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多