dynamic_cast 的问题

hel*_*rld 1 c++ casting shared-ptr

我有这个代码片段:

void addLineRelative(LineNumber number, LineNumber relativeNumber) {
            list<shared_ptr<Line> >::iterator i;
            findLine(i, number);
            if(i == listOfLines.end()){
                throw "LineDoesNotExist";
            }
    
   line 15  if(dynamic_cast<shared_ptr<FamilyLine> >(*i)){
                cout << "Family Line";
            } else {
                throw "Not A Family Line";
            }
        }
Run Code Online (Sandbox Code Playgroud)

我有类 Line 并从它派生 FamilyLine 和 RegularLine,所以我想找到 FamilyLine

我的程序在第 15 行失败,我收到一个错误

cannot dynamic_cast target is not pointer or reference
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗,提前致谢

已编辑

我试过这个:

shared_ptr<FamilyLine> ptr(dynamic_cast<shared_ptr<FamilyLine> >(*i));
if(ptr){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

同样的错误

已编辑

void addLineRelative(LineNumber number, LineNumber relativeNumber) {
        list<shared_ptr<Line> >::iterator i;
        findLine(i, number);
        if(i == listOfLines.end()){
            throw "LineDoesNotExist";
        }

        shared_ptr<FamilyLine> ptr(dynamic_pointer_cast<FamilyLine>(*i));
        if (ptr){
            cout << "Family Line";
        } else {
            throw "Not A Family Line";
        }
    }
Run Code Online (Sandbox Code Playgroud)

收到这个错误

Multiple markers at this line
    - `dynamic_pointer_cast' was not declared in this 
     scope
    - unused variable 'dynamic_pointer_cast'
    - expected primary-expression before '>' token
Run Code Online (Sandbox Code Playgroud)

Geo*_*che 5

shared_ptr不会隐式转换为指针 - 它是一个类类型对象 - and dynamic_caststatic_cast并且const_cast都只对指针进行操作。

虽然您可以使用dynamic_caston shared_ptr<T>::get(),但最好改为使用dynamic_pointer_cast<FamilyLine>(),否则您可能会不小心引入 double- deletes:

返回:
* 当dynamic_cast<T*>(r.get())返回一个非零值时,一个shared_ptr<T>存储它的副本并与 r 共享所有权的对象;
* 否则,一个空shared_ptr<T>对象。
[...]
注释: 看似等效的表达式

shared_ptr<T>(dynamic_cast<T*>(r.get()))
Run Code Online (Sandbox Code Playgroud)

最终会导致未定义的行为,尝试删除同一个对象两次。

例如:

shared_ptr<FamilyLine> ptr(dynamic_pointer_cast<FamilyLine>(*i));
if (ptr) {
    // ... do stuff with ptr
} 
Run Code Online (Sandbox Code Playgroud)

  • @hello:你有`#include &lt;memory&gt;` 吗?你是否对`shared_ptr` 使用了任何特殊的包含(即除了`&lt;memory&gt;`)? (2认同)