首页 > 解决方案 > 无法从 std::shared_ptr<_Ty> 转换为 std::shared_ptr<_Ty>

问题描述

我收到以下错误:

错误 C2440:“static_cast”:无法从“std::shared_ptr<_Ty>”转换为“std::shared_ptr<_Ty> stack\genericstack.h 36 1 Stack

通用堆栈.h

#ifndef _GENERIC_STACK_TROFIMOV_H_
#define _GENERIC_STACK_TROFIMOV_H_

#include <memory>

class GenericStack {
    struct StackNode {
        std::shared_ptr<void> _data; 
        StackNode* _next;
        StackNode(const std::shared_ptr<void>& data, StackNode* next) 
            : _data(data), _next(next) {

        }
    };

    StackNode* _top; 

    GenericStack(const GenericStack&);
    GenericStack& operator=(const GenericStack&);

protected:
    GenericStack();
    ~GenericStack();
    void push(const std::shared_ptr<void>&);
    void pop();
    std::shared_ptr<void>& top();
    bool isEmpty() const;
};

template <class T>
class TStack: private GenericStack {                  
public:
    void push(const std::shared_ptr<T>& p) { GenericStack::push(p); }
    void pop() { GenericStack::pop(); }
    std::shared_ptr<T> top() { return static_cast<std::shared_ptr<T>>(GenericStack::top()); }
    bool empty() const { return GenericStack::isEmpty(); }
};

#endif

GenerickStack.cpp

#include "GenericStack.h"

GenericStack::GenericStack()
    :_top(0) {

};
GenericStack::~GenericStack() {
    while(!isEmpty()) {
        pop();
    }
};

void GenericStack::push(const std::shared_ptr<void>& element) {
    _top = new StackNode(element, _top);
}

std::shared_ptr<void>& GenericStack::top() {
    return _top->_data;
}
void GenericStack::pop() {
    StackNode* t = _top->_next;
    delete _top;
    _top = t;
}

bool GenericStack::isEmpty() const {
    return !_top;
}

主文件

#include <iostream>
#include "GenericStack.h"

int main() {
    TStack<int> gs;

    std::shared_ptr<int> sh(new int(7));
    gs.push(sh);
    std::cout << *gs.top() << std::endl;

    return 0;
}

为什么我会收到错误消息?

我希望转换成功发生,因为使用原始指针,我总是可以从void*实际类型指针转换。

我在这里要做的是创建一个堆栈模板。但我试图尽可能多地重用代码,这样模板类就不会膨胀太多。

谢谢你。

标签: c++pointerscastingshared-ptrsmart-pointers

解决方案


看看构造函数列表shared_ptr。您正在尝试使用重载 9,更具体地说是模板重载 withY = voidT = int。但是,此模板重载不参与重载决议,因为void*不能隐式转换为int*. 换句话说,shared_ptr<void>如果shared_ptr<T>您不能隐式转换void*T*.

为什么不首先使用模板(将GenericStack功能移入TStack),而不是尝试处理void*

但我试图尽可能多地重用代码,这样模板类就不会膨胀太多。

通过“膨胀”,我假设您的意思是模板解决方案会生成太多实例?你有理由相信它确实太多了吗?


推荐阅读