簡體   English   中英

無法從std :: shared_ptr <_Ty>轉換為std :: shared_ptr <_Ty>

[英]Cannot convert from std::shared_ptr<_Ty> to std::shared_ptr<_Ty>

我收到以下錯誤:

錯誤C2440:'static_cast':無法從'std :: shared_ptr <_Ty>'轉換為'std :: shared_ptr <_Ty> stack \\ genericstack.h 36 1堆棧

GenericStack.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;
}

Main.cpp的

#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*到實型指針進行大小寫轉換。

我在這里要做的是創建一個堆棧模板。 但是我正在嘗試重用盡可能多的代碼,以使模板化的類不會膨脹太多。

謝謝。

看一下shared_ptr的構造函數列表 您正在嘗試使用重載9,更具體地說是Y = voidT = int的模板重載。 但是,此模板重載不參與重載解析 ,因為void*不能隱式轉換為int* 換句話說,如果不能將void*隱式轉換為T* ,則不能甚至將shared_ptr<void>顯式轉換為shared_ptr<T>

為什么不首先使用模板(將GenericStack功能移至TStack ),而不是嘗試處理void*

但是我正在嘗試重用盡可能多的代碼,以使模板化的類不會膨脹太多。

通過“膨脹”,我假設您的意思是模板解決方案將生成太多實例? 您是否有任何理由相信這確實太多了?

您會收到此錯誤,因為static_cast要求fromto的類型是可轉換的。 對於shared_ptr ,僅當c'tor重載9參與重載解析時才保留 但這不是,因為void*不能隱式轉換為C ++中的其他對象指針類型,因此需要顯式的static_cast

如果要基於static_casting托管指針類型轉換共享指針,則需要使用std::static_pointer_cast

因此,在插入該修復程序之后

 std::shared_ptr<T> top() { return std::static_pointer_cast<T>(GenericStack::top()); }

您的薄模板包裝器將很好地構建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM